gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 08:23:46 24 4
gpt4 key购买 nike

大家好,我想弄清楚为什么下面的 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
}

最佳答案

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

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 可能根本没有任何访问器——相反,编译器可能会强制执行局部常量/变量的访问规则。

关于为什么 Swift let 在类中是可变的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29190084/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com