知玩指南
白蓝主题五 · 清爽阅读
首页  > 驱动工具

Swift结构体和类区别:什么时候该用哪个?

Swift结构体和的基本差异

在写 Swift 代码时,经常会遇到选择:该用结构体(struct)还是类(class)?虽然它们都能定义属性和方法,但底层行为完全不同。结构体是值类型,类是引用类型,这个根本区别决定了它们的使用场景。

比如你写一个表示坐标的模型,用结构体就特别合适:

struct Point {
var x: Double
var y: Double
}

每次赋值或传参时,都会生成一份独立拷贝。修改其中一个,不会影响另一个。

值类型 vs 引用类型的实际表现

假设你有两个变量指向同一个类实例,修改其中一个的属性,另一个也会跟着变。因为它们指向的是同一块内存地址。

class Person {
var name: String
init(name: String) {
self.name = name
}
}

let p1 = Person(name: "小明")
let p2 = p1
p2.name = "小红"
print(p1.name) // 输出:小红

而换成结构体就不会这样:

struct User {
var name: String
}

var u1 = User(name: "张三")
var u2 = u1
u2.name = "李四"
print(u1.name) // 输出:张三

这种独立性让结构体在处理简单数据模型时更安全,不容易出现意外的数据污染。

可变性控制的不同方式

结构体的属性是否可变,取决于它被声明为变量(var)还是常量(let)。如果一个结构体实例是 let 定义的,内部所有属性都不能改。

类就不受这个限制,即使实例是用 let 声明,只要属性是 var 的,照样可以修改。这是因为类是引用类型,let 只保证引用不变,不保证对象内部状态不可变。

继承与多态:类独有的能力

结构体不支持继承,不能从另一个结构体派生。类可以继承父类的方法和属性,还能重写方法实现多态。如果你需要一套层级分明的类型体系,比如 UI 控件或者网络响应处理器,类会更合适。

不过 Swift 更推荐组合优于继承。很多时候用协议(protocol)配合结构体,也能实现灵活的设计,还避免了继承带来的复杂性。

内存管理机制的差异

类实例由 ARC(自动引用计数)管理,当没有强引用指向它时才会被释放。结构体分配在栈上,生命周期短,访问更快,也不涉及复杂的引用关系。

当你频繁创建和销毁对象,比如处理大量临时数据时,结构体通常性能更好。UIKit 或 SwiftUI 中的视图状态模型,很多都是用结构体实现的,就是这个原因。

实际开发中的选择建议

如果你只是封装一组相关的值,比如尺寸、颜色、坐标、JSON 解析结果,优先考虑结构体。代码更清晰,行为更 predictable。

如果需要共享状态、长期持有资源、或者依赖继承体系,那就用类。比如单例服务、数据库连接、控制器对象等。

Swift 标准库里的 Int、String、Array 都是结构体,说明值类型在语言设计中占了很大比重。苹果官方也建议:能用结构体就不用类,除非你明确需要引用语义。