Swift协议实现等价

Swift协议实现等价,第1张

概述我有以下协议: protocol Cacheable { //....// func identifier() -> String} 我可以让Cacheable实现Equatable吗? 当我做以下: extension Cacheable: Equatable {}func ==(lhs:Cacheable,rhs:Cacheable) -> Bool { re 我有以下协议:
protocol Cacheable {    //....//    func IDentifIEr() -> String}

我可以让Cacheable实现Equatable吗?

当我做以下:

extension Cacheable: Equatable {}func ==(lhs:Cacheable,rhs:Cacheable) -> Bool {     return lhs.IDentifIEr() == rhs.IDentifIEr()}

我得到这个错误消息:协议的扩展Cacheable不能有继承子句

1)允许比较相同类型的两个缓存
protocol Cacheable: Equatable {    //....//    func IDentifIEr() -> String}func ==<T : Cacheable>(lhs: T,rhs: T) -> Bool {    return lhs.IDentifIEr() == rhs.IDentifIEr()}

优点

这是最简单的解决方案。

缺点

您只能比较两个相同类型的Cacheable对象。这意味着下面的代码将失败,为了修复它,你需要使动物符合缓存:

class Animal {}class Dog: Animal,Cacheable {    func IDentifIEr() -> String {        return "object"    }}class Cat: Animal,Cacheable {    func IDentifIEr() -> String {        return "object"    }}let a = Dog()let b = Cat()a == b //such comparison is not allowed

2)允许比较任何类型的高速缓存

protocol Cacheable:Equatable {    //....//    func IDentifIEr() -> String}func ==<T:Cacheable>(lhs: T,rhs: T) -> Bool {    return lhs.IDentifIEr() == rhs.IDentifIEr()}func !=<T:Cacheable>(lhs: T,rhs: T) -> Bool {    return lhs.IDentifIEr() != rhs.IDentifIEr()}func ==<T:Cacheable,U:Cacheable>(lhs: T,rhs: U) -> Bool {    return lhs.IDentifIEr() == rhs.IDentifIEr()}func !=<T:Cacheable,rhs: U) -> Bool {    return lhs.IDentifIEr() != rhs.IDentifIEr()}

优点

删除上面对于解决方案1的限制。现在你可以很容易地比较狗和猫。

缺点

>实现更长。实际上,我不知道为什么只指定==函数是不够的 – 这可能是一个编译器的错误。无论如何,你必须提供的==和!=的实现。
>在某些情况下,这种实现的好处也可能造成一个问题,因为你允许绝对不同的对象之间的比较,编译器是完全正确的。

3)不符合等式

protocol Cacheable {    //....//    func IDentifIEr() -> String}func ==(lhs: Cacheable,rhs: Cacheable) -> Bool {    return lhs.IDentifIEr() == rhs.IDentifIEr()}func !=(lhs: Cacheable,rhs: Cacheable) -> Bool {    return lhs.IDentifIEr() != rhs.IDentifIEr()}

优点

你可以使用Cacheable作为类型,而不需要任何泛型。这引入了一系列全新的可能性。例如:

let c:[Cacheable] = [Dog(),RaceCar()]c[0] == c[1]c[0] != c[1]

使用解决方案1和2这样的代码将失败,你必须在你的类中使用泛型。但是,使用最新的实现,Cacheable被视为一种类型,所以允许你声明一个类型为[Cacheable]的数组。

缺点

您不再声明符合Equatable,因此任何接受Equatable参数的函数都不会接受Cacheable。显然,除了==和!=我们声明他们为缓存。

如果这不是你的代码中的问题,我实际喜欢这个解决方案。能够将协议作为一种类型在许多情况下是非常有用的。

总结

以上是内存溢出为你收集整理的Swift协议实现等价全部内容,希望文章能够帮你解决Swift协议实现等价所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1055598.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存