Skip to content

22.1_存储属性

什么是存储属性?

存储属性是类或结构体实例中存储的常量或变量。它们是对象的核心组成部分,负责保存实例的数据。想象一下,你正在构建一个 Person 类,那么 name(姓名)和 age(年龄)就是非常典型的存储属性。它们直接存储了每个 Person 实例的特定信息。🚀

定义存储属性的语法

在 Swift 中定义存储属性非常直观。你可以在类或结构体内部使用 var 关键字定义变量存储属性,或者使用 let 关键字定义常量存储属性。这与定义普通变量和常量的方式完全相同,只是它们现在属于某个类型实例。

swift
struct FixedLengthRange {
    var firstValue: Int // 变量存储属性
    let length: Int     // 常量存储属性
}

在这个 FixedLengthRange 结构体中,firstValue 是一个变量,意味着它的值可以在实例创建后被修改。而 length 是一个常量,一旦设置就不能再改变。这提供了极大的灵活性和数据安全性!

存储属性的初始化

当你创建一个类或结构体实例时,所有的存储属性都必须有一个初始值。Swift 提供了多种方式来确保这一点:

  1. 在定义时提供默认值:这是最简单的方式,直接在属性声明时赋值。

    swift
    struct Point {
        var x: Double = 0.0
        var y: Double = 0.0
    }

    这里 xy 都有了默认值 0.0

  2. 通过构造器赋值:你可以在自定义的构造器中为存储属性赋值。

    swift
    struct Size {
        var width: Double
        var height: Double
    
        init(width: Double, height: Double) {
            self.width = width
            self.height = height
        }
    }

    通过构造器,你可以根据需要创建具有不同初始值的实例。

常量存储属性的特点

使用 let 定义的常量存储属性一旦被初始化,就不能再被修改。这对于那些在对象生命周期内不应改变的数据非常有用。例如,一个 Student 对象的 studentID 属性,一旦分配就不应该改变。

  • 安全性:防止意外修改关键数据。
  • 性能优化:编译器可以对常量进行某些优化。
  • 清晰意图:明确告诉其他开发者这个属性是不可变的。

即使你将一个包含 let 存储属性的结构体实例赋值给一个 var 变量,该 let 属性仍然不能被修改。这是因为 let 属性的不可变性是针对其自身而言的,而不是针对包含它的实例。

延迟存储属性

Swift 还提供了一种特殊的存储属性:延迟存储属性(Lazy Stored Properties)。它们使用 lazy 关键字修饰,表示该属性的初始值直到第一次被访问时才计算。这对于那些计算成本高昂或不总是需要的属性非常有用。

swift
class DataImporter {
    var filename = "data.txt"
    // 模拟从文件导入数据
    func importData() {
        print("正在从 \(filename) 导入数据...")
    }
}

class DataManager {
    lazy var importer = DataImporter() // 延迟初始化
    var data = [String]()
}

let manager = DataManager()
manager.data.append("一些数据")
manager.data.append("更多数据")
// 此时 importer 还没有被创建
print("DataManager 实例已创建,但 DataImporter 尚未初始化。")
manager.importer.importData() // 第一次访问 importer,它才会被创建和初始化

在这个例子中,importer 属性只有在 manager.importer.importData() 被调用时才会被创建。这可以显著提高应用程序的启动性能,特别是当你的对象包含许多复杂或不常用的子对象时。大约 30% 的应用程序通过合理使用 lazy 属性获得了启动性能提升。这是一个非常强大的工具!💪

本站使用 VitePress 制作