如果总是懒惰地计算全局属性,并且永远不会使用局部属性,那么延迟修饰符会修改什么?

时间:2016-03-16 17:56:00

标签: swift properties lazy-evaluation

Swift编程语言(Swift 2.1)中的第248页注释解释了以下内容:

  

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

     

局部常量和变量永远不会懒惰计算。

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

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

2 个答案:

答案 0 :(得分:2)

"局部常数和变量"在提供的摘录中引用局部范围常量和变量,如在函数的局部变量中。它们不引用对象的属性,如果它们用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
        }()
    }
}

答案 1 :(得分:0)

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

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 
        }


    }