Swift:协议一致性 - 这是一个错误吗?

时间:2014-07-10 17:03:10

标签: swift

(在XCode 6 beta 3上)

此代码引发错误"类型MyClass不符合协议MyProtocol"。

class A {}
class B : A {}

protocol PPP {
    func foobar(x: B)
}
class MyClass : PPP {  // --> error: doesn't conform to PPP
    func foobar(x: A) {}
}

但是,下面的代码没问题:

class MyClass : PPP {
    func foobar(x: B) {}
}
class MySubClass : MyClass {
    override func foobar(x: A) {}
}
var p:PPP = MySubClass()

当我在MySubClass上明确应用PPP时,再次引发同样的错误:

class MyClass : PPP {
    func foobar(x: B) {}
}
class MySubClass : MyClass, PPP {  // --> error: doesn't conform to PPP
    override func foobar(x: A) {}
}

我不确定这种行为是不是错误。你觉得呢?

2 个答案:

答案 0 :(得分:0)

这不是错误。在您的第一个示例中,您的类没有完全实现PPP中的所有方法。 foobar(x: B)func foobar(x: A)不同,即使您可以将B传递到func foobar(x: B)func foobar(x: B) {}添加到MyClass,但它应该有效。

答案 1 :(得分:0)

问题是第一个代码是PPP协议中的方法:

func foobar(x: B)

希望收到B的实例。您要覆盖指定A类型的参数,该参数与B不同,即使它是超类。为了确认协议,您必须完全按照协议中声明的方法实现。我认为这不是一个错误。

更有趣的是,在最后一种情况下:

class MyClass : PPP {
    func foobar(x: B) { print ("BaseB")}
}

class MySubClass : MyClass, PPP {
    override func foobar(x: B) { print("B") }
}

var xx = MySubClass()

xx.foobar(B())

输出B,这是我所期待的。代替:

class MyClass : PPP {
    func foobar(x: B) { print ("BaseB")}
}

class MySubClass : MyClass, PPP {
    override func foobar(x: A) { print("A") }
    override func foobar(x: B) { print("B") }
}

var xx = MySubClass()

xx.foobar(A())
xx.foobar(B())

输出AA,而我期望AB。闻起来像臭虫。