Swift 两个协议中的模糊func

Swift 两个协议中的模糊func,swift,Swift,我认为这可能只是一种罕见的情况,但如何处理来自两个不同协议的相同(不明确)函数呢。例如,我有以下定义: protocol A { func foo() func bar() -> Int } protocol B { func foo() func bar() -> String } 现在我有了一个类a和B。我可以分别为a和B实现不同版本的foo()。如果我可以这样做,我怎么称呼他们 另外,我知道对于bar(),我可以用这样的东西打电话: let

我认为这可能只是一种罕见的情况,但如何处理来自两个不同协议的相同(不明确)函数呢。例如,我有以下定义:

protocol A {
    func foo()
    func bar() -> Int
}

protocol B {
    func foo()
    func bar() -> String
}
现在我有了一个类a和B。我可以分别为a和B实现不同版本的
foo()
。如果我可以这样做,我怎么称呼他们

另外,我知道对于
bar()
,我可以用这样的东西打电话:

let anInt = (instance as A).bar()
let aString = (instance as B).bar()

是否可以在
foo()
函数上执行类似的操作?

否。协议的要点是要求对象提供特定的方法,但该方法不与协议“绑定”。这就是为什么可以使用扩展使现有类使用其现有方法符合新协议的原因


请注意,这听起来像是协议设计中的一个错误。对于相同的方法名,有两个协议需要不同的语义,这表明该方法的名称不正确。

您是否尝试过对foo()执行与对bar()方法相同的操作?看起来应该可以,先转换到正确的协议。@mikeyq6我甚至不能实现两个版本的foo()。将引发“foo()”错误的重新声明。感谢您的回答。正如我在问题中提到的那样,这不应该发生,但事实上它可能发生。如果我使用其他人的库,两个不同的库作者可能彼此不认识,并且碰巧使用了相同的函数。让我们做另一个假设,如果协议的两个版本来自不同的模块,那么在进行一致性测试时是否可以将它们区分开来?嗯…我想…不?不。方法就是方法。如果真的做到了这一点,您必须创建一个适配器对象来处理它(即,一个包含您的对象并符合所需协议的对象)。你希望永远不会遇到这种情况。谢谢你的回答!