一尘不染

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

swift

给定两个协议及其扩展名:

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”

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

这个协议扩展功能对我来说还很新。此外,目前苹果官方的“快速编程指南(预发行版)”中有关此信息的信息很少。

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


阅读 234

收藏
2020-07-07

共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。由于这是该协议 唯一
需要的方法,因此一致性类根本不需要定义该方法:

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(){
         ^
2020-07-07