返回

值类型与引用类型在 Swift 中的差别和方法调度

IOS

为什么结构体是值类型,类是引用类型

值类型和引用类型

在 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

结论

理解值类型和引用类型的区别至关重要,因为它影响着内存管理、性能和代码行为。结构体是值类型,因为它们的副本包含数据副本,而类是引用类型,因为它们的变量存储指向实例的指针。方法调度也遵循值语义(对结构体)和引用语义(对类)。