我正在嘗試將 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 中沒有看到這樣的運算子(我的意思是|=),我不知道這意味著什么。Date 是示例中 NSDate 的子類
uj5u.com熱心網友回復:
Swift 確實有一個|=運算子。它在標題操作員宣告下的檔案中簡要提到
操作員 描述 ? ? |=按位或并賦值
但是,即使在 Objective-C 中,它也不是適合這項作業的運算子。它碰巧起作用了,因為BOOL兩個布林值的按位 ORing 恰好與邏輯 ORing 相同,但這是實作細節的巧合。
在 Swift 中,|=特定于支持按位操作的整數型別。它的主要實作是為BinaryInteger. SwiftDoc 有更好的檔案,這里。對于Bool,您將使用||=(不幸的是,它沒有 SwiftDoc 條目)。
就個人而言,我什至不會使用||=. 當您有很長的條件串列,并且您想在多個運算式之間拆分它們的檢查時,它可以很好地作業。然而,它打敗了 的短路行為||,我認為它更糟。
這是我首先要寫的:
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與date1and在同一天date2,如果它們存在。這實際上只是一種進行范圍檢查的復雜方法。所以讓我們這樣做:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/329180.html
