引入
结构和类是通用、 灵活的构造, 是程序代码的基石。 你可以使用定义常量、 变量和函数的相同语法定义属性和方法, 为结构和类添加功能。
在Swift中, 你只需在一个文件中定义结构或类, 该类或结构的外部接口就会自动提供给其他代码使用。
结构和类的比较
共同点
- 定义属性来存储值
- 定义方法来提供功能
- 定义索引来使用索引语法访问值
- 定义初始化器设置初始状态
- 使用扩展来增加额外功能
- 实现协议来提供某些标准功能
类的额外功能
- 通过继承让一个类继承另一个类的特性
- 类型转换可以在运行时检查实例类型
- 去初始化器可以让类的实例释放分配的资源
- 引用计数允许对一个类实例进行多个引用
类支持的额外功能是以增加复杂性为代价的。 一般来说, 我们更倾向于使用结构, 因为它们更容易推理, 而在适当或必要时使用类。 在实践中, 这意味着你定义的自定义类型大多是结构和枚举。
定义语法
结构和类的定义语法相似。 使用 struct
关键字引入结构, 使用 class
关键字引入类, 在一对花括号中存放定义。
struct SomeStructure {
// 结构体定义
}
class SomeClass {
// 类定义
}
💡
定义一个结构或类, 相当于定义了一个新的Swift类型, 所以请使用大驼峰形式命名(SomeClass这样每个单词首字母大写)。
结构和类示例
// 定义结构体Screen
struct Screen {
// 结构体两个属性width保存屏幕宽度,height保存屏幕高度
var width = 1920
var height = 1080
}
// 定义类Phone
class Phone {
// screen属性保存屏幕信息,这里是Screen的实例
var screen = Screen()
// brand保存品牌,processor保存处理器信息
var brand = "apple"
var processor = "a18"
}
结构和类的实例
上面的Screen和Phone只是定义了新的类型, 并不是一个具体的对象。 我们需要创建对应类型的实例才可以使用它们。
let someScreen = Screen() // 创建屏幕实例
let somePhone = Phone() // 创建手机实例
最简单的实例化语法: 使用类或结构的名称, 后面加上一对圆括号就行。
访问属性
使用 .
语法访问实例的属性。
print(someScreen.width) // 1920
print(somePhone.brand) // apple
手机实例的屏幕属性是一个结构体, 想要获取里面的尺寸信息继续用 .
语法即可。
print(somePhone.screen.height) // 1080
直接给实例属性赋值, 就会更新对应的属性。
someScreen.width = 1280
print(someScreen.width) // 1280
结构类型的成员初始化器
所有结构都有一个自动生成的成员初始化器, 可以用它来初始化新结构实例的成员属性。
类实例不会接受默认的成员初始化器。
身份运算符
由于类是引用类型, 因此多个常量和变量有可能在引用类的同一个实例。 如果想知道两个变量或常量是否指向相同的实例, 可以使用身份运算符。
===
判断身份相同, !==
判断身份不同。
let somePhone = Phone()
let anotherPhone = Phone()
print(somePhone === anotherPhone) // false
print(somePhone !== anotherPhone) // true
⚠️
===
与 ==
是不同的。 ===
是判断两个常量或变量指向完全相同的实例; ==
是判断两个实例的值相等。