I'm looking for cool ways to stride through Date
ranges with different increments (either seconds aka TimeInterval
or with DateComponents
aka .hour
, .minute
)
import Foundation
extension Date: Strideable {
// typealias Stride = SignedInteger // doesn't work (probably because declared in extension
public func advanced(by n: Int) -> Date {
self.addingTimeInterval(TimeInterval(n))
}
public func distance(to other: Date) -> Int {
return Int(self.distance(to: other))
}
}
let now = Date()
let dayAfterNow = Date().addingTimeInterval(86400)
let dateRange = now ... dayAfterNow
let dateArr : [Date] = Array(stride(from: now, to: dayAfterNow, by: 60)) // Solves my task but not exactly how I wanted.
let formatter: DateFormatter = {
let df = DateFormatter()
df.timeStyle = .short
return df }()
print (dateArr.prefix(7).map { formatter.string(from: $0) })
/// This hoever doesn't work
// There must be a way to make it work but couldn't figure it out for now
let errDateArr: [Date] = Array(dateRange)
// Error: Initializer 'init(_:)' requires that 'Date.Stride' (aka 'Double') conform to 'SignedInteger'
The second part of the question is that also i'd like to have something like:
var components = DateComponents()
components.hour = 8
components.minute = 0
let date = Calendar.current.date(from: components)
let dateByComponentArr : [Date] = Array(stride(from: now, to: dayAfterNow, by: components))