語境:
我有一個custom Day Struct內部使用一個Swift Date Property. 如果另一個給定的日期與它本身相同,我將Struct能夠檢查。Day Struct但是,每次Code執行此操作時,我都會App凍結而沒有任何Runtime Error.
代碼
struct Day: Hashable {
private let calendar: Calendar = .current
let date: Date
static func == (lhs: Day, rhs: Day) -> Bool {
return Calendar.current.isDate(lhs.date, inSameDayAs: rhs.date)
}
func isSameDayOfTheWeek(as day: Day) -> Bool {
// Replacing this Line to RETURN TRUE prevents the Crash.
return calendar.component(.weekday, from: self.date) == calendar.component(.weekday, from: day.date)
}
}
enum Time: Int16, Comparable, Identifiable, CaseIterable {
case morning, noon, evening, night
var id: Int16 { self.rawValue }
var name: String { ... }
}
struct ToDo: Hashable, Identifiable {
let id: UUID = UUID()
let block: Block // NSManagedObject
let day: Day
let time: Time
}
struct ToDoView: View {
@FetchRequest(sortDescriptors: [SortDescriptor(\.creationTS)]) private var blocks: FetchedResults<Block>
var body: some View {
ForEach(toDos) { toDo in
Text(toDo.name)
}
}
private var toDos: [ToDo] {
var toDos: [ToDo] = []
for block in blocks {
let startDay: Day = block.safeStartDay
var day: Day = .today
while day >= startDay {
// Removing this Line prevents the Crash.
guard startDay.isSameDayOfTheWeek(as: day) else { continue }
for time in Time.allCases {
toDos.append(ToDo(block: block, day: day, time: time))
}
day = day - 1
}
}
return toDos
}
}
問題
我怎樣才能解決這個問題Crash,并且仍然能夠檢查另一個給定的一天是否與Day Struct它本身的作業日相同?
uj5u.com熱心網友回復:
請注意,在回圈中,如果回傳 false,則回圈永遠不會退出,因為您在繼續之前isSameDayOfTheWeek沒有更改。day
快速解決方法是添加day = day - 1before continue,但更好的解決方案是遵循Day,Strideable以便您可以執行以下操作:
for day in stride(from: .today, through: startDay, step: -1) {
...
}
然后只是做continue會像你預期的那樣作業。
如果我正確理解您在此處嘗試執行的操作,則可以Strideable這樣實作:
func distance(to other: Day) -> Int {
calendar.dateComponents([.day], from: self.date, to: other.date).day!
}
func advanced(by n: Int) -> Day {
guard let date = calendar.date(byAdding: .day, value: n, to: self.date) else {
fatalError("No such date: \(n) days after \(self.date)")
}
return Day(date: date)
}
關于calendar: 的注釋通過將其初始化為current,如果用戶決定在某個時候更改它,則結構的兩個實體可能會以不同的日歷結束,這些日歷具有不同的時區。
let day1 = Day(...)
// some time later...
let day2 = Day(...)
然后比較day1,day2可能會有一些意想不到的結果:
day1.isSameDayOfTheWeek(as: day2) // true, because they are in the same day in day1's timezone
day2.isSameDayOfTheWeek(as: day1) // false, because they are not in the same day in day2's timezone
我建議使用固定static日歷。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/506537.html
