firmy Apple doc: Aby obliczyć sekwencję dat, użyj enumerateDatesStartingAfterDate: matchingComponents: Opcje: usingBlock: Metoda zamiast wywołanie tej metody ( - nextDateAfterDate: matchingComponents: opcje: ) w pętli z poprzedni wynik iteracji pętli.
Jak mam, będzie iteracyjne wszystkie daty dopasowane „matchingComponents” aż skończysz iteracji z „stop.memory = true”
let calendar = NSCalendar.currentCalendar()
let startDate = calendar.startOfDayForDate(NSDate())
let finishDate = calendar.dateByAddingUnit(.Day, value: 10, toDate: startDate, options: [])
let dayComponent = NSDateComponents()
dayComponent.hour = 1
calendar.enumerateDatesStartingAfterDate(startDate, matchingComponents: dayComponent, options: [.MatchStrictly]) { (date, exactMatch, stop) in
print(date)
if date!.compare(finishDate!) == NSComparisonResult.OrderedDescending {
// .memory gets at the value of an UnsafeMutablePointer
stop.memory = true
}
}
Dzięki, myślę, że to jest to, czego szukałem. Jednak warunek w pętli while zwraca true. '(lldb) po endDate' ' (NSDate *) $ 6 = 0x06b9cc60 2012-03-11 00:12:42 + 0000' '(lldb) po currentDate' ' (NSDate *) $ 7 = 0x06b9dd20 2012- 03-11 00:12:42 + 0000' Jednak nadal zwracana jest wartość true. – joostevilghost
Zgaduję, że uruchomiłeś to z startDate = [NSDate date] i endDate = [NSDate date], które powodują dwie daty, które nie są identyczne, ale są bardzo podobne (wyłączone o kilka milisekund). Zmodyfikowałem to tak, aby było bezpieczne dla tego warunku, chociaż jeśli używasz próbnika dat, prawdopodobnie nie będzie to problemem, ponieważ daty zostaną ustawione ręcznie na 00: 00: 00.0, a nie 00:12 : 42.xx i 00: 12: 42.yy – gaige
Działa to świetnie, ale natrafiłem na problem, w którym brakowało mi daty zakończenia w listopadzie. Okazało się, że jest to czas letni. Dodaj to do swojej deklaracji NSCalendar, aby uniknąć, że '[currentCalendar setTimeZone: [NSTimeZone timeZoneWithAbbreviation: @" GMT "]]]; // ignoruj letnie oszczędności' – smokingoyster