Swift结构和类

目录

引入

结构和类是通用、 灵活的构造, 是程序代码的基石。 你可以使用定义常量、 变量和函数的相同语法定义属性和方法, 为结构和类添加功能。

在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
⚠️

===== 是不同的。 === 是判断两个常量或变量指向完全相同的实例; == 是判断两个实例的值相等。