美文网首页
swift中lazy 修饰符和 lazy 方法以及get、set

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

作者: 危险地带_浅笑 | 来源:发表于2018-05-28 15:33 被阅读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

    相关文章

      网友评论

          本文标题:swift中lazy 修饰符和 lazy 方法以及get、set

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