Swift 2.0:协议扩展:具有相同功能签名的两个协议编译错误

Swift 2.0:协议扩展:具有相同功能签名的两个协议编译错误,swift,swift2,Swift,Swift2,鉴于这两个协议及其扩展: protocol FirstDelegate { func someFunc() } protocol SecondDelegate { func someFunc() } extension FirstDelegate { func someFunc() { print("First delegate") } } extension SecondDelegate { func someFunc() {

鉴于这两个协议及其扩展:

protocol FirstDelegate {
    func someFunc()
}

protocol SecondDelegate {
    func someFunc()
}

extension FirstDelegate {
    func someFunc() {
        print("First delegate")
    }
}

extension SecondDelegate {
    func someFunc() {
        print("Second delegate")
    }
}
并试图遵循这两个原则:

class SomeClass: FirstDelegate, SecondDelegate {}
我收到编译时错误:

类型“SomeClass”不符合协议“FirstDelegate”

交换
FirstDelegate
SecondDelegate

class SomeClass: SecondDelegate, FirstDelegate {}
产生反向:

类型“SomeClass”不符合协议“SecondDelegate”

删除其中一个扩展可以解决此问题。同上,为
someFunc()
内部
SomeClass
提供实现

这个协议扩展功能对我来说是相当新的。此外,苹果官方发布的《Swift编程指南(预发布)》中关于它的信息目前还很少


我是否违反了协议扩展的一些规则?

协议定义了协议的要求(方法、属性等) 共形类型

protocol FirstDelegate {
    func someFunc()
}

protocol SecondDelegate {
    func someFunc()
}
使用相同的必需方法定义两个协议
someFunc()
。 一致类型必须实现此方法:

class SomeClass: FirstDelegate, SecondDelegate {
    func someFunc() {
        print("SomeClass implementation")
    }
}
协议扩展提供方法和属性实现 到一致类型。协议扩展的一个特例是 默认实现,即您在此处定义的:

extension FirstDelegate {
    func someFunc() {
        print("First delegate")
    }
}
它为所有类型定义了
someFunc()
的默认实现 符合
FirstDelegate
。因为这是唯一需要的 方法,一致性类不需要定义 方法:

class SomeClass: FirstDelegate {

}

SomeClass().someFunc() // Output: First delegate
但是如果类提供了自己的实现,那么 将用于:

class SomeClass: FirstDelegate {
    func someFunc() {
        print("SomeClass implementation")
    }
}

SomeClass().someFunc() // Output: SomeClass implementation
在本例中,您已经定义了
someFunc()的默认实现
对于这两种协议:

extension FirstDelegate {
    func someFunc() {
        print("First delegate")
    }
}

extension SecondDelegate {
    func someFunc() {
        print("Second delegate")
    }
}
如果一个类提供自己的协议,那么它仍然可以遵守这两个协议 所需方法的实施:

class SomeClass: FirstDelegate, SecondDelegate {
    func someFunc() {
        print("SomeClass implementation")
    }
}
但是该类不能通过使用默认实现来符合

class SomeClass: FirstDelegate, SecondDelegate {

}
对于两个协议 因为有冲突。未指定默认值 应该使用实现,这就是编译器抱怨的原因

实际上,该类现在不符合任何协议。 这可以在报表导航器的完整编译器日志中看到:

main.swift:24:7: error: type 'SomeClass' does not conform to protocol 'FirstDelegate' class SomeClass: FirstDelegate, SecondDelegate { ^ main.swift:5:10: note: multiple matching functions named 'someFunc()' with type '() -> ()' func someFunc() ^ main.swift:19:10: note: candidate exactly matches func someFunc() { ^ main.swift:13:10: note: candidate exactly matches func someFunc() { ^ main.swift:24:7: error: type 'SomeClass' does not conform to protocol 'SecondDelegate' class SomeClass: FirstDelegate, SecondDelegate { ^ main.swift:9:10: note: multiple matching functions named 'someFunc()' with type '() -> ()' func someFunc() ^ main.swift:19:10: note: candidate exactly matches func someFunc() { ^ main.swift:13:10: note: candidate exactly matches func someFunc() { ^ main.swift:24:7:错误:类型“SomeClass”不符合协议“FirstDelegate” 类SomeClass:FirstDelegate,SecondDelegate{ ^ main.swift:5:10:注意:多个名为'someFunc()'的匹配函数,类型为'()->()' func someFunc() ^ main.swift:19:10:注:候选人完全匹配 func someFunc(){ ^ main.swift:13:10:注:候选人完全匹配 func someFunc(){ ^ main.swift:24:7:错误:类型“SomeClass”不符合协议“SecondDelegate” 类SomeClass:FirstDelegate,SecondDelegate{ ^ main.swift:9:10:注意:多个名为'someFunc()'的匹配函数,类型为'()->()' func someFunc() ^ main.swift:19:10:注:候选人完全匹配 func someFunc(){ ^ main.swift:13:10:注:候选人完全匹配 func someFunc(){ ^
您想实现什么?这两种方法中,您希望
SomeClass().someFunc()调用哪一种
?我在玩协议扩展及其语法。通过这一点,我试图了解它们的规则和行为。@mesmerizingsnow两个协议使用完全相同的方法是没有意义的,那么你就不需要两个协议了,因为它们完全一样……有可能吗(如果你想)要显式重用其中一个默认实现,然后在强制实现的类函数中重用,而不必(尽管不一定)重复代码,请?