给定两个协议及其扩展名:
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:
FirstDelegate
SecondDelegate
class SomeClass: SecondDelegate, FirstDelegate {}
产生反向:
类型“ SomeClass”不符合协议“ SecondDelegate”
删除扩展之一可以解决此问题。同上为someFunc()内部提供实现SomeClass。
someFunc()
SomeClass
这个协议扩展功能对我来说还很新。此外,目前苹果官方的“快速编程指南(预发行版)”中有关此信息的信息很少。
我是否违反了某些协议扩展规则?
协议定义了一致性类型的要求(方法,属性等)。
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 { }
对于这两个协议,因为存在 冲突 。未指定应使用哪种默认实现,这就是编译器抱怨的原因。
实际上,该类现在不符合 任何 协议。在报告导航器的完整编译器日志中可以看到:
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(){ ^