Swift 2.0:协议扩展:具有相同函数签名的两个协议编译错误
Swift 2.0: Protocol extensions: Two protocols with the same function signature compile error
给定两个协议及其扩展:
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 {}
我收到编译时错误:
Type 'SomeClass' does not conform to protocol 'FirstDelegate'
交换 FirstDelegate
和 SecondDelegate
:
class SomeClass: SecondDelegate, FirstDelegate {}
产生反向:
Type 'SomeClass' does not conform to protocol 'SecondDelegate'
删除其中一个扩展可以解决问题。在 SomeClass
.
中为 someFunc()
提供实现的同上
这个协议扩展功能对我来说很新。另外目前苹果官方'Swift Programming Guide (Prerelease)'中关于它的信息很少。
我是不是违反了一些协议扩展规则?
协议定义了一个要求(方法、属性...)
一致性类型。
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 不需要定义
全部方法:
class SomeClass: FirstDelegate {
}
SomeClass().someFunc() // Output: First delegate
但是如果 class 提供了自己的实现,那么
将被使用:
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 提供自己的协议,它仍然可以符合这两种协议
所需方法的实现:
class SomeClass: FirstDelegate, SecondDelegate {
func someFunc() {
print("SomeClass implementation")
}
}
但是class不能使用默认实现
class SomeClass: FirstDelegate, SecondDelegate {
}
对于两种协议
因为存在冲突。未指定默认值
应该使用实现,这就是编译器抱怨的原因。
实际上 class 现在符合协议的 none。
这可以在报告导航器的完整编译器日志中看到:
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() {
^
给定两个协议及其扩展:
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 {}
我收到编译时错误:
Type 'SomeClass' does not conform to protocol 'FirstDelegate'
交换 FirstDelegate
和 SecondDelegate
:
class SomeClass: SecondDelegate, FirstDelegate {}
产生反向:
Type 'SomeClass' does not conform to protocol 'SecondDelegate'
删除其中一个扩展可以解决问题。在 SomeClass
.
someFunc()
提供实现的同上
这个协议扩展功能对我来说很新。另外目前苹果官方'Swift Programming Guide (Prerelease)'中关于它的信息很少。
我是不是违反了一些协议扩展规则?
协议定义了一个要求(方法、属性...) 一致性类型。
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 不需要定义
全部方法:
class SomeClass: FirstDelegate {
}
SomeClass().someFunc() // Output: First delegate
但是如果 class 提供了自己的实现,那么 将被使用:
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 提供自己的协议,它仍然可以符合这两种协议 所需方法的实现:
class SomeClass: FirstDelegate, SecondDelegate {
func someFunc() {
print("SomeClass implementation")
}
}
但是class不能使用默认实现
class SomeClass: FirstDelegate, SecondDelegate {
}
对于两种协议 因为存在冲突。未指定默认值 应该使用实现,这就是编译器抱怨的原因。
实际上 class 现在符合协议的 none。 这可以在报告导航器的完整编译器日志中看到:
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() { ^