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

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

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’

交换FirstDelegateSecondDelegate

 class SomeClass: SecondDelegate, FirstDelegate {} 

产生逆转:

类型’SomeClass’不符合协议’SecondDelegate’

删除其中一个扩展可以解决问题。 同上在SomeClasssomeFunc()提供实现。

这个协议扩展function对我来说相当新。 苹果官方的“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") } } 

它为符合FirstDelegate所有类型定义了someFunc()的默认实现。 由于这是该协议唯一需要的方法,因此符合类不需要定义该方法:

 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:错误:类型'SomeClass'不符合协议'FirstDelegate'
 class 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'
 class SomeClass:FirstDelegate,SecondDelegate {
       ^
 main.swift:9:10:注意:多个匹配函数名为'someFunc()',类型为'( - ) - >()'
     func someFunc()
          ^
 main.swift:19:10:注意:候选人完全匹配
     func someFunc(){
          ^
 main.swift:13:10:注意:候选人完全匹配
     func someFunc(){
          ^