【问题标题】:what do parenthesis do after lazy var definition?惰性变量定义后括号做什么?
【发布时间】:2016-05-16 05:38:36
【问题描述】:

我正在分析一些第三方代码,并且有一个看起来像这样的“惰性” v​​ar 语句,我想了解括号在“计算属性”花括号之后的作用:

lazy var defaults:NSUserDefaults = {
    return .standardUserDefaults()
}()

"return .standardUserDefaults()" 是返回 NSUserDefaults 实例对象,为什么要在右大括号后面加一个 ()?

谢谢

【问题讨论】:

    标签: swift parentheses computed-properties


    【解决方案1】:

    我想出了两个例子。第一个例子是你典型的computed property。每次调用变量时都会运行。

    var num = 0
    var myName: String {
        print(num)
        return "xxx"
    }
    
    
    print(myName)
    // 0
    // xxx
    num += 1
    print(myName)
    // 1
    // xxx
    

    第二个例子是self-executing closure。如您所见,它只在第一次调用时运行 print(num)。

    var num = 0
    var myName: String = {
        print(num)
        return "xxx"
    }()
    
    
    print(myName)
    // 0
    // xxx
    num += 1
    print(myName)
    // xxx
    

    为了进一步说明,我返回了 num 并查看它是否在 SEC 中发生变化。它没有。这意味着该块仅在第一次被调用时运行,然后为自己分配返回值。出于所有意图和目的,在第一次调用之后,MyNum 现在为 0,不再是块。

    var num = 0
    var myNum: Int = {
        print(num)
        return num
    }()
    
    
    print(myNum)
    // 0
    // 0
    num += 1
    print(myNum)
    // 0
    

    【讨论】:

    • 感谢清晰的解释!你知道这是否是线程安全的吗?
    【解决方案2】:

    这意味着它是第一次访问默认值时执行的块。如果没有(),则意味着默认值是() -> NSUserDefaults 类型的变量块类型。当您添加() 时,这意味着它只是在访问时执行的块返回的NSUserDefaults

    【讨论】:

    • 谢谢,是的,这很有道理。令我困惑的是,花括号使它看起来像没有 get 的“计算属性”。编译器如何知道它不是计算属性,而是块/闭包?
    • 块末尾的 () 表示它是块调用,而不是块本身。
    • 我还是没完全理解——是闭包吗?有详细的解释吗?这个解释(看起来不错)必须在 Apple 的 swift-documentation 中......我在哪里可以找到它?我还想知道在一本好的 Swift 书中哪里可以找到它?我搜索了 Apple book 和其他书籍 - 但一无所获
    猜你喜欢
    • 1970-01-01
    • 2019-07-04
    • 2013-07-12
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    相关资源
    最近更新 更多