按位包含或 Swift

Bitwise inclusive or in Swift

我正在尝试将 Obj-C 文件重写为 Swift。一切正常,但我不明白那是什么(以及如何在 Swift 中重写它):

BOOL isSelected = NO;
isSelected |= self.date1 && [self.gregorian isDate:date inSameDayAsDate:self.date1];
isSelected |= self.date2 && [self.gregorian isDate:date inSameDayAsDate:self.date2];
rangeCell.selectionLayer.hidden = !isSelected;

我在 Swift 中没有看到这样的运算符(我的意思是 |=),我不明白那是什么意思。在示例中日期是 NSDate 的子类

Swift 确实有一个 |= 运算符。它在 Operator Declarations

标题下的文档中简要提及
Operator Description
|= Bitwise OR and assign

然而,即使在 Objective-C 中,它也不是这项工作的合适人选。它碰巧起作用了,因为 BOOL bit-wise 两个 bool 的 ORing 恰好与逻辑 ORing 相同,但这是实现细节的巧合。

在Swift中,|=特定于支持bit-wise操作的整数类型。它的主要实现是为 BinaryInteger 定义的。 SwiftDoc 有更好的文档,here。对于 Bool,您将使用 ||=(不幸的是,它没有 SwiftDoc 条目)。

就我个人而言,我什至不会使用 ||=。当你有一长串条件,并且你想在多个表达式之间拆分它们的检查时,它很有效。但是,它击败了 || 的 short-circuiting 行为,我认为后者更糟。

首先我会这样写:

let isSelected =
       self.date1.map { date1 in self.gregorian.isDate(date, inSameDayAs: date1) } ?? false
    || self.date2.map { date2 in self.gregorian.isDate(date, inSameDayAs: date2) } ?? false

rangeCell.selectionLayer.hidden = !isSelected

查看它,我发现这实际上是在检查 date 是否与 date1date2 在同一天,如果它们存在。这实际上只是一种进行范围检查的复杂方法。那么让我们这样做吧:

let selectedDays = [self.date1, self.date2].compactMap { [=11=] }

let isSelected = selectedDays.contains(where: { selectedDay in
    self.gregorian.isDate(date, inSameDayAs: selectedDay)
})

rangeCell.selectionLayer.hidden = !isSelected