探索 visionOS - Swift 快速入门【类与结构体 - 基本语法】

我想请讲解下,探索 visionOS - Swift 快速入门【类与结构体 - 基本语法】
最新回答
过期关系

2024-10-13 23:24:57

最近,我持续更新了VisionOS App开发技术系列,这其中包括了Swift语言的讲解。

关于VisionOS App的研发,我们已经开始从面向过程编程的方法的核心语法过渡到面向对象编程的方法。

当提到面向对象编程时,我们首先想到的是类(class)和结构体(struct),这两种通用且灵活的结构成为了面向对象编程的核心工具。我们可以为结构体和类定义属性(变量或常量)并添加方法(函数)。

Swift与Java类似,只需在单一的文件中定义一个结构体或类,系统就会自动生成对外接口。

与结构体相比,类提供了一些附加功能,但这也以增加底层运行环境复杂性为代价。因此,作为一般准则,我们应优先使用结构体,因为它们的运行速度足够快,只有在适当或必要时才使用类。所以,Swift中许多系统库或第三方库都使用结构体。

通过使用struct关键字引入结构体,通过class关键字引入类,并将它们的具体定义放在一对大括号中。

例如,我们定义了一个结构体Rect和一个类Shape。在结构体中,我们并未指定属性的类型,与之前讲述的变量或常量一样,编译器会根据初始化赋值判断类型。

上述的结构体Rect和类Shape的定义仅仅描述了它们是什么,是一个抽象的概念。要描述一个具体的Rect和Shape,就需要实例化一个对象。

通过使用点语法访问实例的属性。语法规则:实例名后面紧跟属性名,两者以点号(.)分隔,不带空格。通过点语法,可以读取属性值,也可以给属性值赋值。

在Swift中,所有的结构体和枚举类型都是值类型。这意味着它们的实例以及实例中所包含的任何值类型的属性,在代码中传递时都会被复制一份,例如,作为函数参数,赋值给一个变量等。

在Swift中,所有的基本类型:整数、浮点数、布尔值、字符串、数组和字典,都是值类型。只是标准库定义的集合,例如数组、字典和字符串,都对复制进行了优化以降低性能成本,与原集合共享同一份内存,共享同样的元素。在集合的某个副本要被修改前,才会复制它的元素。

我们用例子验证一下:

上图中,定义结构体Rect,然后实例化一个实例rect,然后赋值给实例rect1,后面修改rect的width值,打印rect和rect1的width。结果看rect1的width还是修改之前的640.0,就验证了结构体是值类型。

在Swift中,类是引用类型。引用类型在被赋予到一个变量、常量和作为函数参数时,其值不会被拷贝,使用的是已存在实例的引用,而不是其拷贝。

例如,上图中实例化类Shape的实例s,area被设置为125.0,然后把s赋值给另外一个实例s1,再把s1.area设置成100。从打印两者的area,s和s1都被修改成100.0。就类似于C++的对象引用或者C语言中的指针的赋值,s和s1都指向同一个实例。

因为类是引用类型,两个常量和变量可能同时引用同一个类实例。要判定两个常量或变量是否引用同一个类实例就需要使用恒等运算符,Swift提供了两个恒等运算符:相同:=== 和不相同:!==,使用这两个运算符检测两个常量或变量是否引用了同一个实例。