返回
值类型与引用类型在 Swift 中的差别和方法调度
IOS
2023-09-09 15:16:42
为什么结构体是值类型,类是引用类型
值类型和引用类型
在 Swift 中,变量可以持有值类型或引用类型。值类型 存储其自身的值,而引用类型 存储指向另一个内存位置的指针。
结构体是值类型
结构体是值类型,这意味着它们的副本在内存中创建时包含其所有数据的副本。更改结构体变量的值不会影响原始结构体。
struct Point {
var x: Int
var y: Int
}
var point1 = Point(x: 10, y: 20)
var point2 = point1 // 复制值
point2.x = 30
print(point1.x) // 仍为 10
print(point2.x) // 30
类是引用类型
类是引用类型,这意味着它们的变量存储指向类实例的指针。更改引用变量的值会影响原始实例。
class Person {
var name: String
}
var person1 = Person()
person1.name = "John Doe"
var person2 = person1 // 复制引用
person2.name = "Jane Doe"
print(person1.name) // Jane Doe
print(person2.name) // Jane Doe
方法调度
Swift 使用值语义 (对结构体)和引用语义 (对类)进行方法调度。
值语义
对于值类型,方法的调用直接在副本上进行,不影响原始值。
struct Point {
mutating func move(by dx: Int, dy: Int) {
self.x += dx
self.y += dy
}
}
var point = Point(x: 10, y: 20)
point.move(by: 5, dy: 10)
print(point.x) // 仍为 10
引用语义
对于引用类型,方法的调用直接在原始实例上进行,影响所有引用该实例的变量。
class Person {
var name: String
func changeName(to newName: String) {
self.name = newName
}
}
var person = Person()
person.name = "John Doe"
person.changeName(to: "Jane Doe")
print(person.name) // Jane Doe
结论
理解值类型和引用类型的区别至关重要,因为它影响着内存管理、性能和代码行为。结构体是值类型,因为它们的副本包含数据副本,而类是引用类型,因为它们的变量存储指向实例的指针。方法调度也遵循值语义(对结构体)和引用语义(对类)。