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

时间:2015-03-22 01:48:31

标签: swift let

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

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
}

3 个答案:

答案 0 :(得分:4)

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

  

您可以在任何时候修改常量属性的值   初始化,只要它按时间设置为一个确定的值   初始化完成。

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

  

为存储的属性分配默认值或设置其值时   初始化程序中的初始值,设置该属性的值   直接,不要求任何财产观察员。

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

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

答案 1 :(得分:1)

因为您在初始化器中分配它,所以在创建该类的对象时。我只是假设,它取任何最后给定的值然后创建一个常量 如果您在不同的功能中尝试相同,它将无法正常工作。你会收到一个错误。

答案 2 :(得分:1)

在swift 4中是不可能的。 Apple docs says

  

您可以在初始化期间的任何时刻为常量属性赋值,只要在初始化完成时将其设置为确定值即可。一旦为常量属性赋值,就无法进一步修改它。

enter image description here