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

Swift协议实现等价

发布时间:2020-12-14 05:58:53 所属栏目:百科 来源:网络整理
导读:我有以下协议: protocol Cacheable { //....// func identifier() - String} 我可以让Cacheable实现Equatable吗? 当我做以下: extension Cacheable: Equatable {}func ==(lhs:Cacheable,rhs:Cacheable) - Bool { return lhs.identifier() == rhs.identifi
我有以下协议:
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。显然,除了==和!=我们声明他们为缓存。

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

(编辑:李大同)

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

    推荐文章
      热点阅读