覆盖协议扩展默认实现

时间:2020-07-03 13:50:46

标签: ios swift overriding protocols

考虑以下代码

// 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个?

1 个答案:

答案 0 :(得分:3)

如果您将变量声明为协议类型,则它将始终采用协议方法的默认实现,因为该方法是在协议的扩展名中声明的。

不将方法添加到协议声明本身中(您已经声明过不可能),访问兼容类型的特定实现的唯一方法是将some下放到{{1 }}或首先将其存储为B

B
相关问题