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

Posted

技术标签:

【中文标题】Swift 2.0:协议扩展:具有相同函数签名的两个协议编译错误【英文标题】:Swift 2.0: Protocol extensions: Two protocols with the same function signature compile error 【发布时间】:2015-07-23 12:05:53 【问题描述】:

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

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”

删除其中一个扩展程序可以解决问题。同样在SomeClass 中为someFunc() 提供实现。

这个协议扩展功能对我来说相当新。此外,Apple 官方的“Swift Programming Guide (Prerelease)”中有关它的信息目前也很少。

我在这里违反了一些协议扩展规则吗?

【问题讨论】:

你想达到什么目的?您希望SomeClass().someFunc() 调用这两种方法中的哪一种? 我在玩协议扩展及其语法。借此,我试图了解他们的规则和行为。 @mesmerizingsnow 好吧,两个协议拥有完全相同的方法并没有什么意义,那么你就不需要两个协议,因为它们是一样的...... 【参考方案1】:

一个协议为一个协议定义了要求(方法,属性,...) 符合类型。

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。因为这是 only 必需的 该协议的方法,符合的类不需要定义 方法:

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 


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

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

main.swift:24:7:错误:类型“SomeClass”不符合协议“FirstDelegate” 类SomeClass:FirstDelegate,SecondDelegate ^ main.swift:5:10:注意:多个匹配函数名为 'someFunc()' 类型为 '() -> ()' 函数 someFunc() ^ main.swift:19:10:注意:候选人完全匹配 函数 someFunc() ^ main.swift:13:10:注意:候选人完全匹配 函数 someFunc() ^ main.swift:24:7:错误:类型“SomeClass”不符合协议“SecondDelegate” 类SomeClass:FirstDelegate,SecondDelegate ^ main.swift:9:10:注意:多个匹配函数名为 'someFunc()' 类型为 '() -> ()' 函数 someFunc() ^ main.swift:19:10:注意:候选人完全匹配 函数 someFunc() ^ main.swift:13:10:注意:候选人完全匹配 函数 someFunc() ^

【讨论】:

是否可以(如果您愿意)显式重用任一默认实现,然后在强制实现的类函数中,而不必(尽管不一定)重复代码?

以上是关于Swift 2.0:协议扩展:具有相同函数签名的两个协议编译错误的主要内容,如果未能解决你的问题,请参考以下文章

Swift 协议扩展实现另一个具有共享关联类型的协议

swift的clourse:字面量化的函数将函数字面量化-与函数的类型签名相同

在 Swift 中映射符合协议的类型

具有相同签名的函数

在同一个类/结构中具有相同签名的相同函数?超载?

为啥具有“相同签名”的模板和非模板函数重载调用非模板函数?