我在Apple提供的Swift文档中读到了这句话
“Subclasses are only allowed to modify variable properties of superclasses during initialization.”
Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks.
但是,如果我运行此代码,它没有任何问题:
class Person{
var name:String
init(name:String){
self.name = name
}
}
class SuperHero:Person{
var power:String?
init(name:String, power:String?){
self.power = power
super.init(name: name)
}
func changeName (){
// HERE I'M CHANGING A SUPERCLASS VARIABLE outside Initialization!!!
self.name = "Mark"
}
}
let superman = SuperHero(name: "Superman", power: "Fly!")
superman.changeName()
println("\(superman.name)")
我是否误解了文档?
答案 0 :(得分:7)
引用的句子中有严重的误解。这是其自然环境中的原始报价。
只允许子类在初始化期间修改超类的变量属性。您不能修改子类的继承常量属性。
请正确阅读,因为该句话意味着换句话说:
您可以在初始化期间修改超类的变量,但不允许使用超类的常量执行此类操作。
此处没有此类声明:您只能在初始化期间修改变量,但以后您不能修改它们。
我希望现在有道理。
答案 1 :(得分:0)
来自Swift Language Guide的句子是:
只允许子类在初始化期间修改超类的变量属性。
注意"变量"单词是斜体。这意味着在这个单词上有一个 emphasis ,结果句子意味着在初始化期间你只能修改那些可变的超类的属性。
答案 2 :(得分:0)
在扩展我的评论时,这本书说你不能这样做:
class Person{
let name:String
init(name:String){
self.name = name // This is fine, but see warnings below
}
}
class SuperHero:Person{
var power:String?
init(name:String, power:String?){
self.power = power
super.init(name: name) // WARNING: Cannot assign to 'name' in 'self'
}
func changeName (){
// HERE I'M CHANGING A SUPERCLASS VARIABLE outside Initialization!!!
self.name = "Mark" // WARNING: Cannot assign to 'name' in 'self'
}
}
let superman = SuperHero(name: "Superman", power: "Fly!")
superman.changeName()
println("\(superman.name)")
正如我上面评论的那样,只有与下面的句子配对时,句子才有意义:“你不能修改子类的继承常量属性。”它并不是说你只能修改变量 在初始化期间,它说你不能在子类初始化期间(也不是在任何时候)修改继承的常量。初始化一词会分散注意力。