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

Swift let is mutable in classes why?

大家好,我想弄清楚为什么下面的 swift 代码允许我为 class 中的 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
}

因为您是在初始化程序中分配它的,所以在创建 class 的对象时。我只是假设,它采用任何最后给定的值,然后创建一个常量。
如果你想在不同的功能中尝试相同的东西,那是行不通的。你会得到一个错误。

Swift 编程语言Initialization 部分下的 "Modifying Constant Properties During Initialization" 标题说:

You can modify the value of a constant property at any point during initialization, as long as it is set to a definite value by the time initialization finishes.

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

When you assign a default value to a stored property, or set its initial value within an initializer, the value of that property is set directly, without calling any property observers.

属性 的访问器强制存储的 属性 的稳定性并非不可能。如果在初始化期间不使用这些访问器,那么在初始化期间您可以根据需要多次修改常量 属性 是有意义的。

您无法在首次设置后修改示例中的 j,这是因为 j 是局部常量,而不是 属性。 j 可能根本没有任何访问器——相反,编译器可能会强制执行本地 constants/variables.

的访问规则

swift 4 中不可能。 Apple docs says:

You can assign a value to a constant property at any point during initialization, as long as it is set to a definite value by the time initialization finishes. Once a constant property is assigned a value, it can't be further modified.