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

mes*_*ngr 20 swift swift2

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

protocol FirstDelegate {
    func someFunc()
}

protocol SecondDelegate {
    func someFunc()
}

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

extension SecondDelegate {
    func someFunc() {
        print("Second delegate")
    }
}
Run Code Online (Sandbox Code Playgroud)

并试图符合他们两个:

class SomeClass: FirstDelegate, SecondDelegate {}
Run Code Online (Sandbox Code Playgroud)

我收到编译时错误:

类型'SomeClass'不符合协议'FirstDelegate'

交换FirstDelegateSecondDelegate:

class SomeClass: SecondDelegate, FirstDelegate {}
Run Code Online (Sandbox Code Playgroud)

产生逆转:

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

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

这个协议扩展功能对我来说相当新.苹果官方的"Swift编程指南(Prerelease)"中有关它的信息目前还很少.

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

Mar*_*n R 38

协议定义符合类型的要求(方法,属性,......).

protocol FirstDelegate {
    func someFunc()
}

protocol SecondDelegate {
    func someFunc()
}
Run Code Online (Sandbox Code Playgroud)

使用相同的必需方法定义两个协议someFunc().符合类型必须实现此方法:

class SomeClass: FirstDelegate, SecondDelegate {
    func someFunc() {
        print("SomeClass implementation")
    }
}
Run Code Online (Sandbox Code Playgroud)

协议扩展提供了方法和属性实现,以符合的类型.协议扩展的一个特例是 默认实现,这是您在此处定义的:

extension FirstDelegate {
    func someFunc() {
        print("First delegate")
    }
}
Run Code Online (Sandbox Code Playgroud)

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

class SomeClass: FirstDelegate {

}

SomeClass().someFunc() // Output: First delegate
Run Code Online (Sandbox Code Playgroud)

但是如果类提供了自己的实现,那么将使用它:

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

SomeClass().someFunc() // Output: SomeClass implementation
Run Code Online (Sandbox Code Playgroud)

在您的情况下,您已someFunc()两个协议定义了默认实现:

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

extension SecondDelegate {
    func someFunc() {
        print("Second delegate")
    }
}
Run Code Online (Sandbox Code Playgroud)

如果类提供了自己的所需方法实现,那么它仍然可以符合这两种协议:

class SomeClass: FirstDelegate, SecondDelegate {
    func someFunc() {
        print("SomeClass implementation")
    }
}
Run Code Online (Sandbox Code Playgroud)

但是通过使用默认实现,类无法符合

class SomeClass: FirstDelegate, SecondDelegate {

}
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 是否有可能(如果你想)显式地重用其中一个默认实现,然后在强制实现的类函数内部,而不必(尽管不一定)重复代码? (5认同)