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

问题描述 投票:4回答:3

大家好我想弄清楚为什么下面的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
}
swift let
3个回答
4
投票

Swift编程语言的Initialization部分下的“在初始化期间修改常量属性”标题说:

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

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

将默认值分配给存储属性或在初始化程序中设置其初始值时,将直接设置该属性的值,而不调用任何属性观察者。

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

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


1
投票

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


1
投票

在快速4. Apple docs says是不可能的:

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

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.