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

本文探讨了在Swift中如何处理自定义类值的比较,特别是在Optional类型参与比较时Equatable协议的实现细节。通过源码解析,揭示了Optional类型在比较时的自动处理机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言

当我们想要比较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

转载于:https://juejin.im/post/5c25e3ce6fb9a049a711e2e1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值