Swift5.1—延迟属性

简介: Swift5.1—延迟属性

延时加载存储属性是指当第一次被调用的时候才会计算其初始值的属性。在属性声明前使用lazy来标示一个延时加载存储属性。


注意

必须将延时加载属性声明成变量(使用 var 关键字),因为属性的初始值可能在实例构造完成之后才会得到。而常量属性在构造过程完成之前必须要有初始值,因此无法声明成延时加载。


当属性的值依赖于一些外部因素且这些外部因素只有在构造过程结束之后才会知道的时候,延时加载属性就会很有用。或者当获得属性的值因为需要复杂或者大量的计算,而需要采用需要的时候再计算的方式,延时加载属性也会很有用。


下面的例子使用了延时加载存储属性来避免复杂类中不必要的初始化工作。例子中定义了DataImporterDataManager两个类,下面是部分代码:

class DataImporter {
    /*
    DataImporter 是一个负责将外部文件中的数据导入的类。
    这个类的初始化会消耗不少时间。
    */
    var fileName = "data.txt"
    // 这里会提供数据导入功能
}
class DataManager {
    lazy var importer = DataImporter()
    var data = [String]()
    // 这里会提供数据管理功能
}
let manager = DataManager()
manager.data.append("Some data")
manager.data.append("Some more data")
// DataImporter 实例的 importer 属性还没有被创建


DataManager类包含一个名为data的存储属性,初始值是一个空的字符串数组。这里没有给出全部代码,只需知道DataManager类的目的是管理和提供对这个字符串数组的访问即可。


DataManager的一个功能是从文件中导入数据。这个功能由 DataImporter类提供,DataImporter完成初始化需要消耗不少时间:因为它的实例在初始化时可能需要打开文件并读取文件中的内容到内存中。


DataManager管理数据时也可能不从文件中导入数据。所以当 DataManager的实例被创建时,没必要创建一个DataImporter的实例,更明智的做法是第一次用到DataImporter的时候才去创建它。


由于使用了lazyDataImporter的实例importer属性只有在第一次被访问的时候才被创建。比如访问它的属性fileName时:

print(manager.importer.fileName)
// DataImporter 实例的 importer 属性现在被创建了
// 输出“data.txt”


注意

如果一个被标记为 lazy 的属性在没有初始化时就同时被多个线程访问,则无法保证该属性只会被初始化一次。


注:


1.初始化一个属性,又不经常使用,浪费资源。

2.计算型属性,每次调用都要重新计算,造成资源浪费。

3.延迟属性:只在使用时调用一次,且调用后结果被保存。

4.lazy属性必须显示的声明返回值类型,必须声明成var类型;闭包捕获外部属性必须用self调用。

目录
相关文章
|
2月前
|
存储 监控 Swift
Swift 属性
10月更文挑战第29天
31 2
|
7月前
|
存储 Swift
Swift开发——属性检查器
Swift中的属性检查器(willSet, didSet)允许在设置存储属性值前后执行代码。在类`Circle`中,属性`radius`使用属性观察器:willSet在赋值前检查值,若值为负则打印警告;didSet在赋值后比较新旧值,根据变化输出相应信息。在实例`c`中,`radius`从-5变为0时,输出“Input value is negative.”和“The circle gets smaller.”;从0变为10时,输出“Input value is normal.”和“The circle gets larger.”。
224 4
Swift开发——属性检查器
|
7月前
|
存储 程序员 Swift
Swift开发——存储属性与计算属性
Swift推荐使用结构体进行开发,结构体支持属性和方法,且作为值类型。结构体属性包括存储属性(如radius)和计算属性(如r),计算属性不存储值,类似方法。结构体用`struct`定义,命名遵循大驼峰规则。实例名遵循小驼峰规则。属性可在结构体中任意位置定义,静态属性用`static`。存储属性可为`lazy`实现懒加载。结构体实例通过`.`访问属性和方法,静态属性和方法用`结构体名.`访问。计算属性可读写,可通过`get`和`set`定义。程序段1展示了结构体Point和Circle的属性和方法,包括私有属性、只读计算属性、可读写计算属性及`mutating`方法。
48 0
Swift开发——存储属性与计算属性
|
8月前
|
安全 Swift iOS开发
【Swift开发专栏】Swift中的属性观察者与KVO
【4月更文挑战第30天】Swift编程语言支持属性观察者(`willSet`和`didSet`)和键值观察(KVO)来响应属性变化。属性观察者在设置前(`willSet`)和设置后(`didSet`)执行代码,可用于数据绑定。KVO是Cocoa/Cocoa Touch中的机制,需`NSObject`子类和`@objc dynamic`属性配合使用。注意在观察者销毁前移除观察,以避免内存问题。示例展示了属性观察者实现简单数据绑定。
105 1
|
8月前
|
存储 算法 安全
【Swift专题】聊聊Swift中的属性
属性是面向对象语言中非常基础的语法特性,我们讲属性,实际上就是讲与类本身或类实例关联的数据。在面向对象的语言中,类作为重要的数据结构会封装数据与函数,类中的函数我们通常称其为方法,而数据则就是属性。
103 1
|
存储 Swift
Swift属性包装器@propertyWrapper
Swift属性包装器@propertyWrapper
136 0
|
存储 监控 Swift
Swift实用小册09:存储属性、计算属性及属性观察器的使用
Swift实用小册09:存储属性、计算属性及属性观察器的使用
283 0
Swift实用小册09:存储属性、计算属性及属性观察器的使用
|
存储 编译器 Swift
Swift5.0 - day4-闭包、属性、方法、下标
Swift5.0 - day4-闭包、属性、方法、下标
331 0
Swift5.0 - day4-闭包、属性、方法、下标
|
存储 Swift iOS开发
Swift5.1—类型属性
Swift5.1—类型属性
143 0
Swift5.1—类型属性
|
存储
Swift5.1——计算属性
Swift5.1——计算属性
161 0
Swift5.1——计算属性