加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 05:35:53 所属栏目:百科 来源:网络整理
导读:鉴于两个协议及其扩展: protocol FirstDelegate { func someFunc()}protocol SecondDelegate { func someFunc()}extension FirstDelegate { func someFunc() { print("First delegate") }}extension SecondDelegate { func someFunc() { print("Second dele
鉴于两个协议及其扩展:
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’

交换第一名和第二名

class SomeClass: SecondDelegate,FirstDelegate {}

产生反向

Type ‘SomeClass’ does not conform to protocol ‘SecondDelegate’

删除其中一个扩展解决了问题.同时提供SomeClass中someFunc()的实现.

这个协议扩展功能对我来说是比较新的.此外,苹果官方的“Swift编程指南(Prerelease)”中的信息目前很少.

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

协议定义了a的要求(方法,属性,…)
一致型
protocol FirstDelegate {
    func someFunc()
}

protocol SecondDelegate {
    func someFunc()
}

定义了两个具有相同所需方法someFunc()的协议.
一致的类型必须实现这种方法:

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读