Swift let 在类中是可变的,为什么?

Jas*_*man 4 let swift

大家好,我想弄清楚为什么下面的 swift 代码允许我为班级中的 wee 字符串分配一个新值。我认为 let 是不可变的,但它在这里有效。有人可以解释一下。谢谢。

import Foundation


class MyClass {
    let wee:String

    init?(inInt:Int) {
        let j:String = "what"
        //j = "I shouldn't be able to do this wiht let" // error rightly so
        //println(j)
        self.wee = "wow"
        if inInt != 2 {
            return nil
        }
        self.wee = "hey"
        self.wee = "blas" // I shouldn't be able to do this
    }


}

if let myClass:MyClass = MyClass(inInt: 2) {
    myClass.wee // prints blas
}
Run Code Online (Sandbox Code Playgroud)

Cal*_*leb 5

The Swift Programming Language初始化部分下的“在初始化期间修改常量属性”标题说:

您可以在初始化期间的任何时候修改常量属性的值,只要在初始化完成时将其设置为确定值即可。

在字里行间阅读,并考虑到您的示例,这听起来很像设置常量值的限制不适用于初始化。支持该想法的进一步证据出现在同一部分的前面:

当您为存储的属性分配默认值或在初始化程序中设置其初始值时,将直接设置该属性的值,而无需调用任何属性观察器。

存储属性的恒定性由该属性的访问器强制执行的可能性不大。如果在初始化期间没有使用这些访问器,那么您可以在初始化期间根据需要多次修改常量属性。

j在第一次设置后无法在示例中进行修改的事实是因为它是j局部常量,而不是属性。可能根本没有任何访问j器——相反,编译器可能会强制执行局部常量/变量的访问规则。