swift中lazy 修饰符和 lazy 方法以及get、set

2018-05-28  本文已影响35人  危险地带_浅笑

1,懒加载的写法

class ClassA {
    lazy var str: String = {
        let str = "Hello"
        print("只在首次访问输出")
        return str
    }()
}

2,lazy修饰方法

另外一个不太引起注意的是,在 Swift 的标准库中,我们还有一组 lazy 方法,它们的定义是这样的:

func lazy<S : SequenceType>(s: S) -> LazySequence<S>

func lazy<S : CollectionType where S.Index : RandomAccessIndexType>(s: S)
                -> LazyRandomAccessCollection<S>

func lazy<S : CollectionType where S.Index : BidirectionalIndexType>(s: S)
                -> LazyBidirectionalCollection<S>

func lazy<S : CollectionType where S.Index : ForwardIndexType>(s: S)
                -> LazyForwardCollection<S>

这些方法可以配合像 map 或是 filter 这类接受闭包并进行运行的方法一起,让整个行为变成延时进行的。在某些情况下这么做也对性能会有不小的帮助。例如,直接使用 map 时:

let data = 1...3
let result = data.map {
    (i: Int) -> Int in
    print("正在处理 \(i)")
    return i * 2
}

print("准备访问结果")
for i in result {
    print("操作后结果为 \(i)")
}

print("操作完毕")

这么做的输出为:

// 正在处理 1
// 正在处理 2
// 正在处理 3
// 准备访问结果
// 操作后结果为 2
// 操作后结果为 4
// 操作后结果为 6
// 操作完毕

而如果我们先进行一次 lazy 操作的话,我们就能得到延时运行版本的容器:

let data = 1...3
let result = data.lazy.map {
    (i: Int) -> Int in
    print("正在处理 \(i)")
    return i * 2
}

print("准备访问结果")
for i in result {
    print("操作后结果为 \(i)")
}

print("操作完毕")

此时的运行结果:

// 准备访问结果
// 正在处理 1
// 操作后结果为 2
// 正在处理 2
// 操作后结果为 4
// 正在处理 3
// 操作后结果为 6
// 操作完毕

对于那些不需要完全运行,可能提前退出的情况,使用 lazy 来进行性能优化效果会非常有效。

注:以上内容摘录来自: 王巍 (onevcat). “Swifter - Swift 必备 Tips (第四版)”。

3,get/set方法

   var _name:String?
    var name:String?{
        get{
            return _name;
        }
        set{
            // 只要外界通过.name给name赋值,就会把值给newValue ,我刚学swift的时候,不知道这个newValue
            age = newValue   
            _name = newValue
            
        }
        
    }

4,didSet/willSet

 var score:String?{
        didSet{
            print("oldValue:\(oldValue)");
        }
        
        willSet{
            print("newValue:\(newValue)")
        }
    }

上面内容不多说,看打印就知道怎么回事,最主要要知道默认的的两个参数oldValuenewValue

上一篇下一篇

猜你喜欢

热点阅读