大家好我想弄清楚为什么下面的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
}
答案 0 :(得分:4)
初始化期间"修改常量属性" The Swift Programming Language 的Initialization部分下的标题说:
您可以在任何时候修改常量属性的值 初始化,只要它按时间设置为一个确定的值 初始化完成。
在行之间进行阅读,并考虑到您的示例,这听起来非常类似于设置常量值不适用于初始化的限制。支持这一想法的进一步证据出现在同一部分的前面:
为存储的属性分配默认值或设置其值时 初始化程序中的初始值,设置该属性的值 直接,不要求任何财产观察员。
存储属性的持久性不太可能由该属性的访问器强制执行。如果在初始化期间没有使用这些访问器,那么在初始化期间可以根据需要多次修改常量属性是有意义的。
首次设置后,您无法在示例中修改j
,这是因为j
是本地常量,而不是属性。可能根本没有j
的任何访问者 - 相反,编译器可能会强制执行本地常量/变量的访问规则。
答案 1 :(得分:1)
因为您在初始化器中分配它,所以在创建该类的对象时。我只是假设,它取任何最后给定的值然后创建一个常量 如果您在不同的功能中尝试相同,它将无法正常工作。你会收到一个错误。
答案 2 :(得分:1)