返回

Swift 类与结构体(上)

IOS

类别 VS 结构体:Swift 中的一场语义对决

引言

在 Swift 编程范式中,类和结构体是两个基本概念,它们共同构建了对象导向和值语义编程的世界。虽然它们都是封装数据和行为的类型,但它们在语义和使用方面却有细微差别,这往往会让初学者感到困惑。在这篇文章中,我们将深入探讨 Swift 中类和结构体的异同,帮助你理解它们的本质并做出明智的编程决策。

语义对比

类和结构体最根本的区别在于它们的语义含义。

  • 类(Class): 类表示一种对象类型,它定义了对象的属性、方法和行为。类实例是独立于其类的实体,它们拥有自己的内存空间并可以相互引用。
  • 结构体(Struct): 结构体是一种值类型,它封装了相关数据的集合。结构体实例是其值的副本,它们直接存储在内存中,并且不能相互引用。

初始化器

另一个关键区别是初始化方式。

  • 类: 类使用初始化器方法来创建实例,这些方法负责为实例分配内存并设置其初始状态。类可以有多个初始化器,每个初始化器都可以使用不同的参数列表。
  • 结构体: 结构体使用成员变量初始化器语法来初始化实例,它允许你直接为结构体的成员变量赋值。结构体只能有一个初始化器,它使用一个固定参数列表。

生命周期

类和结构体在生命周期方面也有差异。

  • 类: 类遵循引用语义,这意味着变量存储对类实例的引用。当实例不再被引用时,它将被自动销毁。
  • 结构体: 结构体遵循值语义,这意味着变量存储结构体的副本。当变量超出其作用域时,结构体副本将被销毁。

具体示例

以下代码示例说明了类和结构体的这些差异:

// 类示例
class Person {
    var name: String
    var age: Int

    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

// 结构体示例
struct Point {
    var x: Double
    var y: Double

    init(x: Double, y: Double) {
        self.x = x
        self.y = y
    }
}

// 使用示例
let person1 = Person(name: "John", age: 30) // 创建 Person 类的实例
let person2 = person1 // 复制 person1 的引用

person1.name = "Jane" // 更改 person1 的 name 属性

print(person2.name) // 输出:Jane,因为 person2 引用了同一个实例

let point1 = Point(x: 1.0, y: 2.0) // 创建 Point 结构体的实例
let point2 = point1 // 复制 point1 的值

point1.x = 3.0 // 更改 point1 的 x 属性

print(point2.x) // 输出:1.0,因为 point2 是 point1 值的副本

总结

理解类和结构体之间的差异对于编写高效且语义清晰的 Swift 代码至关重要。选择合适的类型取决于具体的需求。对于需要引用语义和动态行为的对象,类是更合适的选择;对于需要值语义和数据封装的不可变值,结构体是更好的选择。