Swift-为什么实现Equatable不需要处理Optional

871 阅读1分钟

引言

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

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

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

只需要比较各个属性值相等就可以了,但是我发现一个问题,我们没有处理Optional的情况啊,函数的参数没有,貌似代码在Optional的情况下工作的也挺正常

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

探索

于是在网上搜索了一下,发现也有人有同样的疑惑,这位仁兄做了实验,发现Optional的情况和预期一致,所以不用管了。

It just works!

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

然后就在Optional.swift的中看到了这样的代码,就是他替我们处理了Optional的情况(我们省略了大量的注释,建议大家看下注释内容,写得非常仔细)

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;

剩下的情况就都返回false。

参考资料

Optional.swift

swift-equatable-with-optionals