【问题标题】:If global properties are always computed lazily, and local properties are never, what does the lazy modifier modify?如果全局属性总是惰性计算,而局部属性从不计算,那么惰性修饰符会修改什么?
【发布时间】:2016-07-02 18:53:45
【问题描述】:

The Swift Programming Language (Swift 2.1) 第 248 页的注释解释如下:

全局常量和变量总是延迟计算,类似于延迟存储属性。与惰性存储属性不同,全局常量和变量不需要使用惰性修饰符进行标记。

从不延迟计算局部常量和变量。

摘自:Apple Inc.“Swift 编程语言 (Swift 2.1)。” https://itunes.apple.com/us/book/swift-programming-language/id881256329?mt=11

除了lazy 修饰符会产生影响的全局属性和局部值之外,还有其他类型的常量或变量吗?

【问题讨论】:

    标签: swift properties lazy-evaluation


    【解决方案1】:

    提供的摘录中的“局部常量和变量”指的是局部范围的常量和变量,就像在函数的局部变量中一样。它们不引用对象的属性,如果它们被标记为 lazy 关键字,则可以是惰性的。

    //global, declared outside of a class/struct
    //error is "Lazy is only valid for members of a struct or class
    lazy var label: UILabel = {
        var tempLabel: UILabel = UILabel()
        tempLabel.text = "hi"
        return tempLabel
    }()
    
    class SomeClass : NSObject {
        //non-lazy instance property
        var x = 3
    
        //lazy instance property
        lazy var label: UILabel = {
            var tempLabel: UILabel = UILabel()
            tempLabel.text = "hi"
            return tempLabel
        }()
    
    
        func doStuff() {
            //error is "Lazy is only valid for members of a struct or class
            lazy var label: UILabel = {
                var tempLabel: UILabel = UILabel()
                tempLabel.text = "hi"
                return tempLabel
            }()
        }
    }
    

    【讨论】:

    • 对象的属性和“全局常量和变量”有什么区别?
    • @grossmae 我的示例编辑是否消除了差异?
    • @grossmae 抱歉,为了清楚起见,我仍在编辑。你可以有全局变量,在你的类之外声明,它们总是懒惰的。你可以在你的类上拥有静态的,它总是惰性的,你可以在你的方法中拥有局部变量,它们从不惰性,也不能是惰性的,你可以拥有可以惰性或不惰性的实例属性。
    • 全局变量是如何偷懒的?如果我使用let removedElement = myArray.remove(at: 0),它会立即被删除,而不是等到我在其他任何地方使用removedElement。我不明白这种全球性的懒惰是什么。
    • @RoboRobok 我的来源是全局和局部变量下的this, same as OP linked:,上面写着“注意全局常量和变量总是延迟计算,类似于延迟存储属性。”我承认,一旦在 Apple 文档中发现它,我并没有真正进一步调查它。如果您使用的是 Playground,那么您看到的可能只是 Playground 工作方式的副作用。
    【解决方案2】:

    这里的全局是指在类括号{ }声明的变量和常量例如

    var anotherProerty : AClass() //This will be lazy by default 
    
    Class Abc 
        {
            var aProperty : AClass()  // This will NOT be lazy by default
            //however it can be lazy by declaring it with 'lazy' KEYWORD
    
            func abc()
            {
                var another: AClass()  //This cannot be lazy 
            }
    
    
        }
    

    【讨论】:

      猜你喜欢
      • 2016-07-16
      • 2020-03-03
      • 2014-09-02
      • 2017-10-07
      • 2014-09-22
      • 2015-01-19
      • 2018-07-29
      • 2018-06-11
      • 1970-01-01
      相关资源
      最近更新 更多