考虑以下代码
// GENERATED PROTOCOL, CANNOT BE MODIFIED
protocol SomeProtocol {
}
// GENERATED CLASS, CANNOT BE MODIFIED
class A {
}
// GENERATED CLASS, CANNOT BE MODIFIED
class B: A, SomeProtocol {
}
// I CAN CHANGE ONLY FROM HERE BELOW
extension SomeProtocol {
func someMethod() {
print("protocol implementation")
}
}
extension B {
func someMethod() {
print("class implementation")
}
}
let some: SomeProtocol = B()
some.someMethod() //this prints "protocol implementation"
我想要some.someMethod()打印“类实现”。我知道有多种方法可以实现,一种方法是在SomeProtocol中添加someMethod,但是不幸的是,我无法更改SomeProtocol,A或B中的任何一个,这些都是生成的。我只能玩扩展程序。有没有一种方法可以实现而不触及前面提到的3个?
答案 0 :(得分:3)
如果您将变量声明为协议类型,则它将始终采用协议方法的默认实现,因为该方法是在协议的扩展名中声明的。
不将方法添加到协议声明本身中(您已经声明过不可能),访问兼容类型的特定实现的唯一方法是将some
下放到{{1 }}或首先将其存储为B
。
B