Skip to content

Instantly share code, notes, and snippets.

@vrudikov
Forked from preble/DateRange.swift
Created May 5, 2016 12:03
Show Gist options
  • Save vrudikov/90f363f9a97c75ad73e1fc26603ebefe to your computer and use it in GitHub Desktop.
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/
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