类和结构体
1.Swift不需要你为自定义类和结构体创建独立的接口和实现文件。在 Swift 中,你在一个文件中定义一个类或者结构体, 则系统将会自动生成面向其他代码的外部接口。
2.类与结构体的对比:
在 Swift 中类和结构体有很多共同之处,它们都能:
- 定义属性用来存储值;
- 定义方法用于提供功能;
- 定义下标脚本用来允许使用下标语法访问值;
- 定义初始化器用于初始化状态;
- 可以被扩展来默认所没有的功能;
- 遵循协议来针对特定类型提供标准功能。
类有而结构体没有的额外功能:
- 继承允许一个类继承另一个类的特征;
- 类型转换允许你在运行检查和解释一个类实例的类型;
- 反初始化器允许一个类实例释放任何其所被分配的资源;
- 引用计数允许不止一个对类实例的引用。
3.结构体在你的代码中通过复制来传递,并且并不会使用引用计数。
4.定义:无论你在何时定义了一个新的类或者结构体,实际上你定义了一个全新的 Swift 类型。
class SomeClass {
// class definition goes here
}
struct SomeStructure {
// structure definition goes here
}
5.初始化器语法最简单的是在类或结构体名字后面接一个空的圆括号,例如 Resolution()或者 VideoMode()。
6.结构体类型的成员初始化器
struct Resolution {
var width = 0
var height = 0
}
let vga = Resolution(width: 640, height: 480)
7.结构体和枚举是值类型
值类型是一种当它被指定到常量或者变量,或者被传递给函数时会被拷贝的类型。
Swift 中所有的结构体和枚举都是值类型,这意味着你所创建的任何结构体和枚举实例——和实例作为属性所包含的任意值类型——在代码传递中总是被拷贝的。
8.类是引用类型
相对于拷贝,这里使用的是同一个对现存实例的引用。
9.有时候找出两个常量或者变量是否引用自同一个类实例非常有用,为了允许这样,Swift提供了两个特点运算符:
- 相同于 ( ===),意味着两个类类型常量或者变量引用自相同的实例;
- 不相同于( !==)
10.按照通用准则,当符合以下一条或多条情形时应考虑创建一个结构体:
- 结构体的主要目的是为了封装一些相关的简单数据值;
- 当你在赋予或者传递结构实例时,有理由需要封装的数据值被拷贝而不是引用;
- 任何存储在结构体中的属性是值类型,也将被拷贝而不是被引用;
- 结构体不需要从一个已存在类型继承属性或者行为。
11.字符串,数组和字典的赋值与拷贝行为
Swift 的 String , Array 和 Dictionary类型是作为结构体来实现的,这意味着字符串,数组和字典在它们被赋值到一个新的常量或者变量,亦或者它们本身被传递到一个函数或方法中的时候,其实是传递了拷贝。
12.在上述有关字符串,数组和字典“拷贝”的描述中。你在代码中所见到的行为好像总是拷贝。然而在后台 Swift 只有在需要这么做时才会实际去拷贝。Swift 能够管理所有的值的拷贝来确保最佳的性能,所有你也没必要为了保证最佳性能来避免赋值。
网友评论