Swift惰性初始化(lazy)属性

本文介绍了惰性初始化的定义,通过Objective C的代码示例解释了其概念。在Swift中,有两种方式进行惰性初始化:简单表达式和闭包,并强调了使用小括号的重要性及类型声明的必要性。惰性初始化适用于属性依赖外部因素初始化、需要复杂计算、不确定是否使用以及定制化初始化等场景。

原创Blog,转载请注明出处
blog.youkuaiyun.com/hello_hwc


一 惰性初始化的定义

在Objective C中,惰性初始化是这样写的

@property (strong,nonatomic) CAShapeLayer * shapelayer;

-(CAShapeLayer *)shapelayer{
    if (!_shapelayer) {
        _shapelayer = [CAShapeLayer layer];
    }
    return _shapelayer;
}

那么何为惰性初始化呢?
从OC的代码中不难看出,惰性初始化,就是在变量第一次使用的时候才进行初始化。


二 Swift中的惰性初始化

Swift中,有两种方式来惰性初始化。
第一种,简单表达式

    lazy var first = NSArray(objects: "1","2")

第二种,闭包

lazy var second:String = {
        return "second"
        }()


注意

  • 不要忘记最后的小括号,只有加了小括号,必包才会在掉用的时候立刻执行。
  • 要类型声明lazy var second:String,这样Xcode会进行类型检查。

三 惰性初始化的使用场景

属性本身依赖于外部因素才能初始化
completeURL表示完整的URL,这个变量依赖于自身的url是否含有http://前缀

class Demo{
    var url:NSString
    lazy var completeURL:NSString = {
        [unowned self] in
        if self.url.hasPrefix("http://"){
            return self.url
        }else{
            return "http://".stringByAppendingString(self.url)
        }
        }()
    init(url:NSString){
        self.url = url
    }
}

属性需要复杂计算,消耗大量CPU

lazy var second:Int = {
        var sum = 0
        for i in 1...100000{
            sum += i
        }
        return sum
        }()

属性不确定是否会使用到

官网的例子,注意,对于Manager来说,使用的时候,可能导入,也可能不倒入数据。从硬盘读取数据的代价是很大的,不导入数据的时候,不要初始化
class DataImporter {
    /*
    DataImporter is a class to import data from an external file.
    The class is assumed to take a non-trivial amount of time to initialize.
    */
    var fileName = "data.txt"
    // the DataImporter class would provide data importing functionality here
}

class DataManager {
    lazy var importer = DataImporter()
    var data = [String]()
    // the DataManager class would provide data management functionality here
}

let manager = DataManager()
manager.data.append("Some data")
manager.data.append("Some more data")

定制化的初始化
有些初始化只需要初始化一次,在变量定义的地方初始化,有助于代码维护

lazy var dataArray:NSMutableArray = {
        var array = NSMutableArray()
        for  i in 1...100{
            array.addObject(NSNumber(integer: i))
        }
        return array
        }()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值