我有兴趣了解 Swift 编译器设计背后的原因,即允许在初始化器中为属性赋值,即使它被定义为常量。难道用
let
定义的任何东西都不允许发生变异吗?
示例代码:
struct Exercise {
let name: String
// works fine (why?)
init(name: String) {
self.name = name
}
// throws error (makes sense)
mutating func changeName(name: String) {
self.name = name
}
}
您没有改变初始化器中的常量。您正在初始化程序中使用常量的初始(且唯一)值来初始化该常量。
这一切都在 Swift 书的初始化章节中介绍。请参阅在初始化期间分配常量属性部分。
另请注意,如果您根本没有提供任何
init
,您的显式 init
只是复制您将收到的结构的默认 init
。
struct Exercise {
let name: String
// throws error (makes sense)
mutating func changeName(name: String) {
self.name = name
}
}
let someExercise = Exercise(name: "Some Name")
上面的代码与您问题中的代码相同。如果您注释掉
changeName
中的错误行,那么代码就可以正常工作。