按位包含或 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
是否与 date1
和 date2
在同一天,如果它们存在。这实际上只是一种进行范围检查的复杂方法。那么让我们这样做吧:
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
我正在尝试将 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
是否与 date1
和 date2
在同一天,如果它们存在。这实际上只是一种进行范围检查的复杂方法。那么让我们这样做吧:
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