我是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()
。我究竟做错了什么?
提前谢谢!
答案 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)