Swift-为何实现Equatable不须要处理Optional

引言

当咱们想要比较Swift中自定义类值是否相等的时候,咱们就须要实现Equatable协议git

协议就只有下面这一个方法github

static func == (lhs: Self, rhs: Self) -> Boolswift

只须要比较各个属性值相等就能够了,可是我发现一个问题,咱们没有处理Optional的状况啊,函数的参数没有,貌似代码在Optional的状况下工做的也挺正常app

那么参数是Optional时到底发生了什么呢?函数

探索

因而在网上搜索了一下,发现也有人有一样的疑惑,这位仁兄作了实验,发现Optional的状况和预期一致,因此不用管了。spa

It just works!3d

那就更疑惑了,没写代码怎么就能够用呢,好在swift是开源的,咱们能够一路找到swift是如何实现这样的功能的。code

而后就在Optional.swift的中看到了这样的代码,就是他替咱们处理了Optional的状况(咱们省略了大量的注释,建议你们看下注释内容,写得很是仔细)get

extension Optional : Equatable where Wrapped : Equatable {

  @inlinable
  public static func ==(lhs: Wrapped?, rhs: Wrapped?) -> Bool {
    switch (lhs, rhs) {
    case let (l?, r?):
      return l == r
    case (nil, nil):
      return true
    default:
      return false
    }
  }
}
复制代码

也就是说,若是lhs和rhs,不是nil,那么就用咱们实现的方法;若是都是nil,那么就返回true;it

剩下的状况就都返回false。

参考资料

Optional.swift

swift-equatable-with-optionals

相关文章
相关标签/搜索