在Swift中更改超类变量

时间:2014-06-23 08:33:32

标签: swift

我在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)")

我是否误解了文档?

3 个答案:

答案 0 :(得分:7)

引用的句子中有严重的误解。这是其自然环境中的原始报价。

  

只允许子类在初始化期间修改超类的变量属性。您不能修改子类的继承常量属性。

请正确阅读,因为该句话意味着换句话说:

  1. 您可以在初始化期间修改超类的变量,但不允许使用超类的常量执行此类操作。

  2. 此处没有此类声明:您只能在初始化期间修改变量,但以后您不能修改它们。

  3. 我希望现在有道理。

答案 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)")

正如我上面评论的那样,只有与下面的句子配对时,句子才有意义:“你不能修改子类的继承常量属性。”它并不是说你只能修改变量 在初始化期间,它说你不能在子类初始化期间(也不是在任何时候)修改继承的常量。初始化一词会分散注意力。