考虑以下代码
// 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"
字符串
我想要一些.someMethod()来打印“class implementation”。我知道有一些方法可以实现这一点,其中一种方法是在SomeProtocol中添加someMethod,但是,不幸的是,我不能改变任何SomeProtocol,A或B,这些都是生成的。我只能玩扩展。有没有一种方法可以做到这一点,而不触及前面提到的3?
1条答案
按热度按时间7vhp5slm1#
如果将变量声明为协议类型,它将始终采用协议方法的默认实现,因为该方法是在协议的扩展中声明的。
在不将方法添加到协议声明本身的情况下(您已经说过这对您来说是不可能的),访问符合类型的特定实现的唯一方法是将
some
向下转换为B
或首先将其存储为B
。字符串