首先我會重寫你的結構,
這兩個屬性都可以是不可變的。
而不是爲日期的字符串,我使用的NSDate,和雙爲持續時間
struct Hour {
let date: NSDate
let duration: Double
init(date: NSDate, duration: Double) {
self.date = date
self.duration = duration
}
}
我創建的時間像
let hoursData = [
Hour(date: { let c = NSDateComponents(); c.day = 29; c.month = 11; c.year = 2015; return NSCalendar.currentCalendar().dateFromComponents(c)!}(), duration: 7),
Hour(date: { let c = NSDateComponents(); c.day = 12; c.month = 12; c.year = 2015; return NSCalendar.currentCalendar().dateFromComponents(c)!}(), duration: 7),
Hour(date: { let c = NSDateComponents(); c.day = 14; c.month = 12; c.year = 2015; return NSCalendar.currentCalendar().dateFromComponents(c)!}(), duration: 7),
Hour(date: { let c = NSDateComponents(); c.day = 15; c.month = 12; c.year = 2015; return NSCalendar.currentCalendar().dateFromComponents(c)!}(), duration: 7)]
,如果你想知道這個語法:我使用隱式未命名的閉包創建NSDate參數
現在我篩選一個月和一年使用reduce
方法來總結過濾對象
let today = NSDate()
let totalDuration = hoursData.filter{
let objectsComps = NSCalendar.currentCalendar().components([.Month, .Year], fromDate: $0.date)
let todaysComps = NSCalendar.currentCalendar().components([.Month, .Year], fromDate: today)
return objectsComps.month == todaysComps.month && objectsComps.year == todaysComps.year
}.reduce(0) { (duration, hour) -> Double in
duration + hour.duration
}
雖然這是一個很好的答案,我想指出的是,羅布的回答有一個小缺陷:結構Hour
隱藏它有日期字符串必須是某種格式的依賴。這違反了Dependency Inversion Principle,D的SOLID Principles。但這很容易解決。
只要在創建Hour
實例時通過日期格式化程序。
struct Hour {
let date: NSDate
let duration: Double
init(date: NSDate, duration: Double) {
self.date = date
self.duration = duration
}
init (dateFormatter:NSDateFormatter, dateString:String, duration:Double) {
self.init(date: dateFormatter.dateFromString(dateString)!, duration:duration)
}
}
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "MMM d, y"
let hoursData = [
Hour(dateFormatter: dateFormatter, dateString: "Nov 29, 2015", duration: 7),
Hour(dateFormatter: dateFormatter, dateString: "Dec 12, 2015", duration: 7),
Hour(dateFormatter: dateFormatter, dateString: "Dec 14, 2015", duration: 7),
Hour(dateFormatter: dateFormatter, dateString: "Dec 25, 2015", duration: 7),
Hour(dateFormatter: dateFormatter, dateString: "Dec 25, 2017", duration: 7)
]
現在誰曾經使用Hour
可以定義爲所需要的格式,可能會在本地化的應用程序很有幫助。
過濾和減少保持不變。
但現在我們有了一個新的問題:NSDateformatter's
dateFromString()
可能返回零。目前我們用!
強制解包,但這可能在生產應用中很糟糕。
我們應該允許適當的錯誤處理,通過允許方便初始化拋出錯誤
enum HourError: ErrorType {
case InvalidDate
}
struct Hour {
let date: NSDate
let duration: Double
init(date: NSDate, duration: Double) {
self.date = date
self.duration = duration
}
init (dateFormatter:NSDateFormatter, dateString:String, duration:Double) throws {
let date = dateFormatter.dateFromString(dateString)
guard date != nil else { throw HourError.InvalidDate}
self.init(date: date!, duration:duration)
}
}
,如果我們使用它像
do {
let now = NSDate()
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "MMM d, y"
let hoursData = [
try Hour(dateFormatter: dateFormatter, dateString: "Nov 29, 2015", duration: 7),
try Hour(dateFormatter: dateFormatter, dateString: "Dec 12, 2015", duration: 7),
try Hour(dateFormatter: dateFormatter, dateString: "Dec 14, 2015", duration: 7),
try Hour(dateFormatter: dateFormatter, dateString: "Dec 25, 2015", duration: 7),
/*⛈*/ try Hour(dateFormatter: dateFormatter, dateString: " 25, 2017", duration: 7)
]
let totalDuration = hoursData.filter{
let objectsComps = NSCalendar.currentCalendar().components([.Month, .Year], fromDate: $0.date)
let todaysComps = NSCalendar.currentCalendar().components([.Month, .Year], fromDate: now)
return objectsComps.month == todaysComps.month && objectsComps.year == todaysComps.year
}.reduce(0) {
$0 + $1.duration
}
print(totalDuration)
} catch HourError.InvalidDate{
print("one or more datestrings must be wrong")
}
錯誤會被抓住。
的full code
什麼是參數時間?一個時間點?持續時間?爲什麼它是一個字符串而不是數字類型?對於日期,您應該使用NSDate或NSDateComponents對象。 – vikingosegundo
Viking提供了一個很好的觀點,通常它是一個糟糕的想法(TM),試圖製作自己的日期結構。如果您想使用日期的某個單位,請使用NSDateComponents。 – Kevin
@vikingosegundo參數時間是一個小時,所以說7個小時的時間。這在我的腦海中是有道理的,對不起,我沒有很好地解釋它。它們都是字符串,因爲它們是由用戶輸入並放入表格中的。正如我所說我是新手,所以這似乎是最好的辦法。但是,使用NSDate輸入日期。 –