在swift中覆盖方法的问题

时间:2016-01-05 05:05:33

标签: swift

我是swift的新手并且在以下代码中遇到了一些错误:

class Player {
    var  name: String
    var score: Int

    func playerInfo()->(String, Int){
        return (name, score)
    }

    init(name:String, score:Int){
        self.name  = name
        self.score = score
    }
}

final class GoldPlayer : Player {
    var status: String
    init(name: String, score: Int, status: String) {
        self.status = "Gold"
        super.init(name: name, score: score)
    }
    func playerInfo() -> (String, Int, String) {
        return (name, score, status)

    }

}

错误在线,我覆盖playerInfo() -> (String, Int, String) 如果我在方法前面键入override,则会收到错误消息method does not override any methods from its superclass。如果我不输入override,当我从类实例调用该方法时会收到错误消息,即ambiguous use of playerInfo()。我究竟做错了什么? 提前谢谢!

2 个答案:

答案 0 :(得分:3)

正如Tikhonov的回答所提到的,你不能覆盖该方法,因为它们有不同的返回类型。所以删除覆盖关键字

这里的实际问题是编译器无法确定您尝试调用哪种方法。因此,您只需要指定存储返回值的变量的类型

let instance = GoldPlayer()

let x: (String, Int, String) = instance.playerInfo()

如果你没有明确指定存储函数结果的变量的类型,那么你将得到错误"模糊地使用playInfo"因为编译器只能根据它们的返回类型区分这两个函数,而你没有提供这些信息。

答案 1 :(得分:2)

因为编译器不知道你想使用什么类型。

您可以完全指定类型

let goldPlayer = GoldPlayer(name: "Vasa", score: 33, status: "high")
let result: (String, Int, String)  = goldPlayer.playerInfo()

并且您不能使用override关键字,因为您的函数具有不同的签名。在第一种情况func f()-> (String, Int),第二种情况func f() -> (String, Int, String)。如果第二个函数的返回类型为(String, Int)

,则可以使用override