ios 覆盖协议扩展默认实现

v1uwarro  于 2023-08-08  发布在  iOS
关注(0)|答案(1)|浏览(110)

考虑以下代码

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

7vhp5slm

7vhp5slm1#

如果将变量声明为协议类型,它将始终采用协议方法的默认实现,因为该方法是在协议的扩展中声明的。
在不将方法添加到协议声明本身的情况下(您已经说过这对您来说是不可能的),访问符合类型的特定实现的唯一方法是将some向下转换为B或首先将其存储为B

let some: SomeProtocol = B()
some.someMethod() //this prints "protocol implementation"
(some as? B)?.someMethod() // this prints "class implementation"

let someB = B()
someB.someMethod() // this prints "class implementation"

字符串

相关问题