Swift

结构体与类

本文介绍了 Swift 中的结构体和类,包括它们的定义语法、实例化、访问属性、逐一成员初始化器、值类型和引用类型等。

在 Swift 中,结构体(Structures)和类(Classes)是构建代码的通用基石。它们都可以定义属性来存储值,定义方法来提供功能,定义下标以便访问值,定义初始化器来设置初始状态,以及通过扩展和协议来增强功能。

定义语法

结构体和类有着相似的定义语法。我们使用 struct 关键字引入结构体,使用 class 关键字引入类。

struct Resolution {
    var width = 0
    var height = 0
}

class VideoMode {
    var resolution = Resolution()
    var interlaced = false
    var frameRate = 0.0
    var name: String?
}

实例化

创建结构体和类实例的语法非常相似:

let someResolution = Resolution()
let someVideoMode = VideoMode()

这会创建属性均初始化为默认值的实例。

访问属性

使用点语法访问实例的属性:

print("The width of someResolution is \(someResolution.width)")
// 打印 "The width of someResolution is 0"

也可以使用点语法为变量属性赋值:

someVideoMode.resolution.width = 1280
print("The width of someVideoMode is now \(someVideoMode.resolution.width)")
// 打印 "The width of someVideoMode is now 1280"

结构体的逐一成员初始化器

所有结构体都有一个自动生成的成员逐一初始化器(Memberwise Initializer),用于初始化新实例的成员属性。

let vga = Resolution(width: 640, height: 480)

类实例接收默认的成员逐一初始化器。

结构体和枚举是值类型

值类型(Value Type)是指在被赋值给变量、常量或传递给函数时,其值会被拷贝的类型。Swift 中的所有基本类型(整数、浮点数、布尔值、字符串、数组和字典),以及结构体和枚举,都是值类型。

let hd = Resolution(width: 1920, height: 1080)
var cinema = hd
cinema.width = 2048

print("cinema is now \(cinema.width) pixels wide")
// 打印 "cinema is now 2048 pixels wide"

print("hd is still \(hd.width) pixels wide")
// 打印 "hd is still 1920 pixels wide"

cinemahd 的一个拷贝,修改 cinema 不会影响 hd

类是引用类型

引用类型(Reference Type)在被赋值或传递时不会被拷贝,而是引用同一个已存在的实例。

let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0

let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0

print("The frameRate of tenEighty is now \(tenEighty.frameRate)")
// 打印 "The frameRate of tenEighty is now 30.0"

tenEightyalsoTenEighty 实际上引用的是同一个 VideoMode 实例。

恒等运算符

因为类是引用类型,可能出现多个常量或变量引用同一个类实例的情况。使用恒等运算符来判断两个常量或变量是否引用同一个实例:

  • 相同 (===)
  • 不相同 (!==)
if tenEighty === alsoTenEighty {
    print("tenEighty and alsoTenEighty refer to the same VideoMode instance.")
}

注意,“相同”(引用同一个实例)与“相等”(值相等)是不同的概念。

选择类还是结构体

通常建议默认使用结构体。仅在需要以下特性时使用类:

  1. 需要继承。
  2. 需要引用语义(多个变量共享同一个实例)。
  3. 需要析构器 (deinit) 来释放资源。
在 GitHub 上编辑

上次更新于