Swift,我可以使用更具体的派生参数类型覆盖方法

sri*_*gde 5 overriding overloading swift ios8.3

PlayingCard继承自Card

鉴于具有相同名称的两个函数:

 func match(othercards : [PlayingCard]) ->  Int {
     return 2 
 }

 func match(othercards : [Card]) ->  Int {
     return 2 
 }
Run Code Online (Sandbox Code Playgroud)

它抛出错误说:覆盖方法与选择器'匹配:'具有不兼容的类型'([PlayingCard]) - > Int'

为什么???它的两个函数具有相同的名称但两种不同的参数为什么它仍然要求覆盖?如果我这样做,那么即使这被称为错误

bhs*_*cer 0

由于 PlaingCard 继承自 Card,因此不允许您以这种方式重写该方法。

考虑一下如果您尝试使用 PlayingCard 实例调用 match 会发生什么。它会调用这两个方法中的哪一个?这会产生歧义,因此是不允许的。

在这种情况下,一种解决方案是更改采用更具体类型的方法的名称。例如

 func matchPlayingCard(othercards : [PlayingCard]) ->  Int {
     return 2 
 }
Run Code Online (Sandbox Code Playgroud)