我有以下情况,真正的代码更多,但这提供了一个很好的总和的情况。 (如果您想知道这是使用动态加载的UICollectionView):
protocol P {
static var name: String {get}
}
extension P {
static var name: String {
return String(Self)
}
}
protocol P2 {
getType() -> P.Type
getName() -> String
}
class A: P {
}
class B: A {
}
class C1: P2 {
func getType() -> P.Type {
return A.self
}
func getName() -> String {
return A.name
}
}
class C2: P2 {
func getType() -> P.Type {
return B.self
}
func getName() -> String {
return B.name
}
}
现在发生的事情如下:
C1.getType().name //"A" as expected
C1.getName() //"A" as expected
C2.getType().name //"A" why?
C2.getName() //"B" as expected
我没有任何线索为什么C2.getType.name
返回“A”。我检查了调试器并正确执行了函数,C2返回的类型是B。
我正在使用XCode 7.3和Swift 2.2
答案 0 :(得分:1)
这是因为协议扩展不是多态的。 name
的实现在协议扩展中,并显示为:
static var name: String {
return String(Self)
}
Self
是采用者。谁采用P?这是A:
class A: P {
}
这就是事情的发展;在此上下文中Self
不是多态解释。如果你想要多态,你需要在类本身中实现name
- 就像你使用getName
一样。