返回

探索 Swift 属性的奇妙世界:存储、计算、懒加载与类型属性

IOS

存储属性:为变量和常量提供住所

存储属性是 Swift 中最基本的属性类型,它允许您将变量或常量值存储为实例的一部分。在结构体和类中,变量存储属性用 var 声明,常量存储属性用关键字 let 声明。

例如,以下代码定义了一个名为 name 的字符串存储属性:

struct Person {
    var name: String
}

您可以在实例化 Person 结构体时为 name 属性赋值:

let person = Person(name: "John")

计算属性:无中生有,一举两得

计算属性是一种强大的属性类型,它允许您在访问属性时执行计算并返回结果。计算属性没有存储空间,这意味着它们不会占用内存。

例如,以下代码定义了一个计算属性 fullName,它将 firstNamelastName 两个存储属性连接在一起:

struct Person {
    var firstName: String
    var lastName: String

    var fullName: String {
        return "\(firstName) \(lastName)"
    }
}

您可以在访问 fullName 属性时获取 firstNamelastName 的连接结果:

let person = Person(firstName: "John", lastName: "Doe")
print(person.fullName) // 输出:"John Doe"

懒加载属性:按需计算,节省资源

懒加载属性是一种特殊的计算属性,它只有在第一次访问时才会计算并返回结果。这意味着懒加载属性可以节省内存和计算资源。

例如,以下代码定义了一个懒加载属性 image,它只有在访问时才会从磁盘加载图像数据:

struct Person {
    private lazy var image: UIImage? = {
        guard let data = try? Data(contentsOf: URL(string: "https://example.com/image.jpg")) else {
            return nil
        }

        return UIImage(data: data)
    }()
}

您可以在访问 image 属性时获取图像数据,如果图像数据不存在,则返回 nil

let person = Person()
if let image = person.image {
    // 图像数据存在,可以使用它了
} else {
    // 图像数据不存在
}

类型属性:共享属性,一劳永逸

类型属性是一种特殊属性,它与实例属性不同,类型属性是属于类型的,而不是属于实例的。类型属性只能在类中定义,不能在结构体中定义。

例如,以下代码定义了一个名为 count 的类型属性,它存储了该类型的所有实例的数量:

class Person {
    static var count = 0

    init() {
        Person.count += 1
    }
}

您可以使用类型属性来访问和修改该类型的共享属性:

print(Person.count) // 输出:0

let person1 = Person()
print(Person.count) // 输出:1

let person2 = Person()
print(Person.count) // 输出:2

结论:属性的世界,大放异彩

Swift 属性是一个强大的语言特性,它允许您定义和操作各种类型的属性,包括存储属性、计算属性、懒加载属性和类型属性。通过熟练掌握属性的使用,您可以构建更加优雅和高效的代码。