Lazy 初始化技术早在 Objective C 时代经常被使用,是一种用来延时创建一些比较消耗资源的对象的技术。

这种技术在 iOS 开发里面很有用,确保只有在需要使用某些资源的时候才开始分配内存。

老的方式

这是在 Objective C 里面的写法:

@property (nonatomic, strong) NSMutableArray *players;

- (NSMutableArray *)players {
    if (!_players) {
        _players = [[NSMutableArray alloc] init];
    }
    return _players;
}

Swift 新方式

lazy var players = [String]()

非常简单,就一句话!

需要注意的是,声明 lazy 变量必须用 var 关键字,不能使用 let。因为常量对象初始化完成的时候必须有一个初始值。

使用 Closure 定义 lazy 属性:

lazy var players = {
    var temporaryPlayers = [String]()
    temporaryPlayers.append("John Doe")
    return temporaryPlayers
}()

使用实例方法:

lazy var players: [String] = self.initialPlayers()

func initialPlayers() -> [String] {
    var players = ["John Doe"]
    return players
}

或类方法:

class TestClass {
    lazy var players = TestClass.initialPlayers()

    class func initialPlayers() -> [String] {
        var players = ["John Doe"]
        return players
    }
}

很明显,一般情况下使用 Closure 方式创建是最简单的,能够一目了然。

本文翻译并修改自 Lazy Initialization with Swift