Self 和 lazy

接口和类方法中的Self

有这样的接口:

protocol Copyable {
    func copy() -> Self
}

返回要为抽象的,表示当前类型的Self, 用dynamicType,如果要构建Self,需要有required 的初始化方法:

class CustomClass: Copyable {
    var num = 1
    func copy() -> Self {
        let result = self.dynamicType.init()
        result.num = num
        return result
    }
    required init() {
    }
}

验证一下:

let source = CustomClass()
source.num = 20

let new = source.copy()
source.num = 2
source.num     // 2
new.num        // 20

lazy

在使用map时:

let data = 1...3
let after = data.map { (i: Int) -> Int in
    print("正在处理\(i)")
    return i * 2
}
print("准备结果")
for i in after {
    print("操作后的结果\(i)")
}
print("finished")

结果为:

正在处理1
正在处理2
正在处理3
准备结果
操作后的结果2
操作后的结果4
操作后的结果6
finished

如果用lazy,data.map 改为data.lazy.map, 结果为:

准备结果
正在处理1
操作后的结果2
正在处理2
操作后的结果4
正在处理3
操作后的结果6
finished

对于不需要完全运行,可能提前退出,使用lazy有性能提升。

你可能感兴趣的:(Self 和 lazy)