1.首先进行一下类和结构体的对比:
共同点:
定义属性用于存储值
定义方法用于提供功能
定义构造器用于生成初始化值
通过扩展增加默认实现的功能
实现协议提供某种标准功能类还有更多功能:
允许继承
引用计数允许对一个类的多次引用
2.实例化类和结构体语法
class Some{}
struct SomeStuct{}
3.
结构体中属性的访问通过点语法。
结构体都有一个自动生成的成员主意构造器。
-
结构体和枚举是值类型,创建多个结构体对象事,是对值的复制,而不是指向相同实例
struct SomeStru{ var width= 0 var height =0 } let some = SomeStru() some.width = 10 let one = some one.width = 20 print("\(one.width).....\(some.width)") // 20...10
在将some
赋值给one
时,实际上是将some
里的值拷贝给了one
,将拷贝的值存入新的SomeStru
实例中。some
和one
相互独立,不会影响互相的值。
- 类是引用类型,在被赋值到一个变量或常量时,值不会被拷贝,引用的是已经存在的实例本身而不是值拷贝
4.恒等运算符:判断两个常量或变量是否引用同一个实例
- 等价于
===
表示两个类类型(class type)的常量或者变量引用同一个类实例 - 不等价于
!==
表示两个实例的值“相等”或“相同”,判定时要遵照设计者定义的评判标准,因此相对于“相等”来说,这是一种更加合适的叫法。
5.类和结构体的选择
以下考虑结构体:
- 该数据结构的主要目的是用来封装少量相关简单数据值。
- 有理由预计该数据结构的实例在被赋值或传递时,封装的数据将会被拷贝而不是被引用。
- 该数据结构中储存的值类型属性,也应该被拷贝,而不是被引用。
- 该数据结构不需要去继承另一个既有类型的属性或者行为。
6.字符串(String)、数组(Array)、和字典(Dictionary)类型的赋值与复制行为
Swift 中,许多基本类型,诸如String,Array和Dictionary类型均以结构体的形式实现。这意味着被赋值给新的常量或变量,或者被传入函数或方法中时,它们的值会被拷贝。
Objective-C 中NSString,NSArray和NSDictionary类型均以类的形式实现,而并非结构体。它们在被赋值或者被传入函数或方法时,不会发生值拷贝,而是传递现有实例的引用。