引言
当我们想要比较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。
网友评论