-
-
Save vrudikov/90f363f9a97c75ad73e1fc26603ebefe to your computer and use it in GitHub Desktop.
Experimenting with creating a SequenceType for iterating over a range of dates. Blogged here: http://adampreble.net/blog/2014/09/iterating-over-range-of-dates-swift/
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
func < (left: NSDate, right: NSDate) -> Bool { | |
return left.compare(right) == NSComparisonResult.OrderedAscending | |
} | |
struct DateRange : SequenceType { | |
var calendar: NSCalendar | |
var startDate: NSDate | |
var endDate: NSDate | |
var stepUnits: NSCalendarUnit | |
var stepValue: Int | |
func generate() -> Generator { | |
return Generator(range: self) | |
} | |
struct Generator: GeneratorType { | |
var range: DateRange | |
mutating func next() -> NSDate? { | |
let nextDate = range.calendar.dateByAddingUnit(range.stepUnits, | |
value: range.stepValue, | |
toDate: range.startDate, | |
options: NSCalendarOptions.allZeros) | |
if range.endDate < nextDate { | |
return nil | |
} | |
else { | |
range.startDate = nextDate | |
return nextDate | |
} | |
} | |
} | |
} | |
// Usage: | |
func testDateRange() { | |
let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian) | |
let startDate = NSDate(timeIntervalSinceNow: 0) | |
let endDate = NSDate(timeIntervalSinceNow: 24*60*60*7) | |
let dateRange = DateRange(calendar: calendar, | |
startDate: startDate, | |
endDate: endDate, | |
stepUnits: NSCalendarUnit.CalendarUnitDay, | |
stepValue: 1) | |
var days = 0 | |
for date in dateRange { | |
days++ | |
} | |
XCTAssertEqual(days, 7, "Expected 7 days") | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment