gpt4 book ai didi

Swift:协议(protocol)一致性——这是不是一个错误?

转载 作者:可可西里 更新时间:2023-10-31 23:45:47 24 4
gpt4 key购买 nike

(在 XCode 6 beta 3 上)

此代码引发错误“Type MyClass does not conform to protocol 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) {}
}

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

最佳答案

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

func foobar(x: B)

期望收到 B 的实例。您正在覆盖指定类型为 A 的参数,这与 B 不同,即使它是父类(super class)也是如此。为了确认协议(protocol),您必须完全按照协议(protocol)中声明的方式实现方法。我不认为这是一个错误。

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

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。闻起来像 bug 。

关于Swift:协议(protocol)一致性——这是不是一个错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24682387/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com