I'm trying to rewrite Obj-C file to Swift. Everything is ok but i can't understand what's that (and how to rewrite it in 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;
I don't see such operator in Swift (i mean |=) and i can't figure out what that means. Date is subclass of NSDate in example
CodePudding user response:
Swift does have an |= operator. It's briefly mentioned in the Docs under the heading Operator Declarations
Operator Description ⋮ ⋮ |=Bitwise OR and assign
However, it's not the right operator for the job, even in Objective-C. It happened to work, because BOOL bit-wise ORing of two bools happened to be identical to a logical ORing, but that was an coincidence of the implementation details.
In Swift, |= is specific to integer types which support bit-wise manipulations. The main implementation of it is defined for BinaryInteger. SwiftDoc has better docs on it, here. For Bool, you would use ||= (which doesn't have a SwiftDoc entry, unfortunately).
Personally, I wouldn't even use ||=. It works well when you have a long list of conditions, and you want to split their checks between multiple expressions. However, it defeats the short-circuiting behavior of ||, which I think is worse.
Here's how I would first write this:
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
Looking over it, I see that what this is really doing, is checking if date is in the same day as date1 and date2, if they exist. It's really just a complicated way to do a range check. So let's do that:
let selectedDays = [self.date1, self.date2].compactMap { $0 }
let isSelected = selectedDays.contains(where: { selectedDay in
self.gregorian.isDate(date, inSameDayAs: selectedDay)
})
rangeCell.selectionLayer.hidden = !isSelected
