【发布时间】:2020-07-03 15:46:53
【问题描述】:
我正在寻找很酷的方法来跨越 Date 范围以不同的增量(秒又名 TimeInterval 或 DateComponents 又名 .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'
问题的第二部分是我也想要类似的东西:
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))
【问题讨论】:
-
是的,
Calendar的enumerateDates()非常有帮助,@Martin。但是在某些情况下,我们只需要一个可迭代的序列本身,也许是懒惰的。我想知道为什么NSCalendar中的DateRange被丢弃了。
标签: swift range sequence date-range