美文网首页iOS学习包
转:Swift惰性初始化(lazy)属性

转:Swift惰性初始化(lazy)属性

作者: 方克己 | 来源:发表于2015-12-03 18:26 被阅读101次

    转自http://www.helloswift.com.cn/swiftbase/2015/0414/3580.html
    一 惰性初始化的定义

    在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 }()
    

    相关文章

      网友评论

        本文标题:转:Swift惰性初始化(lazy)属性

        本文链接:https://www.haomeiwen.com/subject/xldshttx.html