美文网首页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)属性

    转自http://www.helloswift.com.cn/swiftbase/2015/0414/3580.h...

  • Swift 懒加载Lazy

    1.Lazy Variables 惰性变量是按需初始化的存储属性,只能在struct或class中使用惰性变量。例...

  • kotlin中lateinit 和by lazy

    一、 lateinit 延迟初始化 二、by lazy惰性初始化(区别于lateinit)

  • Swift构造方法

    构造方法作用:对实例对象的内容进行初始化Swift要求类或者结构体中的存储属性(非lazy属性)在对象构造完毕后要...

  • 构造方法总结一

    作用:对实例对象的内容进行初始化Swift要求类或者结构体中的存储属性(非lazy的)在对象构造完毕后要有初始化值...

  • Swift 懒加载 lazy(集合的懒加载原理)

    Swift 懒加载 lazy 惰性存储属性是一种直到第一次使用它时才计算其初始值的属性。通过在其声明之前写入laz...

  • swift3.0- 构造函数

    构造函数的介绍 作用: 对实例对象的内容进行初始化Swift要求类或者结构体中的存储属性(非lazy的)在对象构造...

  • 构造方法

    构造方法: 作用:对实例对象的内容进行初始化Swift要求类或者结构体中的存储属性(非lazy的)在对象构造完毕后...

  • Swift: lazy 属性的写法

    序言:OC中有懒加载,Swift中用lazy关键字声明属性,也可以实现懒加载。lazy所修饰的属性只有第一次访问时...

  • Swift 延迟属性 lazy

    惰性初始化的使用场景 属性本身依赖于外部因素才能初始化属性需要复杂计算,消耗大量CPU属性不确定是否会使用到定制化...

网友评论

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

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