使用 Swift 3.0 操控日期
作者:Joe,原文鏈接,原文日期:2016-09-20
譯者:Cwift;校對:walkingway;定稿:CMB
當你在想要 大規模重命名 時,一個附帶的挑戰就是要確保所有相關的文檔都必須同步更新。比如,截至到 2016 年 9 月 20 日,DateFormatter 的文檔依舊沒有與版本統一,引用的是 Swift 2.3 風格的 API(譯者註:現在是 2017年,文檔依舊沒有更新...)。隨著時間的推移,這些疏漏毫無疑問都會被糾正,這裏是一些使用 Date
以及 DateFormatter
實現的日期格式化的示例。
官方文檔中當前的示例如下:
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .mediumStyle
dateFormatter.timeStyle = .noStyle
let date = Date(timeIntervalSinceReferenceDate: 118800)
// US English Locale (en_US)
dateFormatter.locale = Locale(localeIdentifier: "en_US")
NSLog("%@", dateFormatter.stringFromDate(date)) // Jan 2, 2001
// French Locale (fr_FR)
dateFormatter.locale = Locale(localeIdentifier: "fr_FR")
NSLog("%@", dateFormatter.stringFromDate(date)) // 2 janv. 2001
// Japanese Locale (ja_JP)
dateFormatter.locale = Locale(localeIdentifier: "ja_JP")
NSLog("%@", dateFormatter.stringFromDate(date)) // 2001/01/02
在 Swift 3.0 中變為:
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
dateFormatter.timeStyle = .none
註意 .mediumStyle
被簡化為 .medium
。這種簡化符合規則,我們知道類型是 DateFormatter.Style
所以沒有理由重復 Style 一詞。使用 .none
替換 .noStyle
也是同理。
現在看看設置格式化器的環境時發生的改動:
// US English Locale (en_US)
dateFormatter.locale = Locale(identifier: "en_US")
print(dateFormatter.string(from:date)) // Jan 2, 2001
// French Locale (fr_FR)
dateFormatter.locale = Locale(identifier: "fr_FR")
print(dateFormatter.string(from:date)) // 2 janv. 2001
// Japanese Locale (ja_JP)
dateFormatter.locale = Locale(identifier: "ja_JP")
print(dateFormatter.string(from:date)) // 2001/01/02
再一次,我們看到了從 Locale(localeIdentifier:)
到 Locale(identifier:)
的簡化。減少了類型名及其引用。類似地,DateFormatter
的 stringFromDate
方法已經被簡化為 string(from:)
,完整的方法簽名是 string(from:Date)
。理解這種模式了嗎?
繼續用一個 String
描述的信息生成一個 Date
對象,蘋果的文檔展示了這樣的示例:
let RFC3339DateFormatter = DateFormatter()
RFC3339DateFormatter.locale = Locale(localeIdentifier: "en_US_POSIX")
RFC3339DateFormatter.dateFormat = "yyyy-MM-dd‘T‘HH:mm:ssZZZZZ"
RFC3339DateFormatter.timeZone = TimeZone(forSecondsFromGMT: 0)
let string = "1996-12-19T16:39:57-08:00"
let date = RFC3339DateFormatter.dateFromString(string)
為了減少啰嗦和不必要的詞匯,得到了下面的寫法:
let RFC3339DateFormatter = DateFormatter()
RFC3339DateFormatter.locale = Locale(identifier: "en_US_POSIX")
RFC3339DateFormatter.dateFormat = "yyyy-MM-dd‘T‘HH:mm:ssZZZZZ"
RFC3339DateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
let string = "1996-12-19T16:39:57-08:00"
let date = RFC3339DateFormatter.date(from:string)
TimeZone
構造器中刪除了無關的三個字符(for),而且正如期望, dateFromString
方法變成了 date(from:)
。
經驗法則
從 Swift 2 轉換到 Swift 3 時,一個通用法則是:去除多余的單詞。如果你之前習慣了寫 formatter.timeStyle = .fullStyle
,現在你要習慣 formatter.timeStyle = .full
的寫法。如果你看到了 someTypeFromAnotherType()
這樣的寫法,它可能已經被替換為 someType(from:AnotherType)
。說一下我的體驗,在使用 Swift 3 幾個月時間後,再回到 Swift 2 會感覺命名過於冗長,這還是在我喜歡這種詳細自說明語言風格的前提下。不過一旦你學會了 Swift,你會擁抱海明威而避開托爾斯泰。
愉快地 Swift 吧!
本文由 SwiftGG 翻譯組翻譯,已經獲得作者翻譯授權,最新文章請訪問 http://swift.gg。
使用 Swift 3.0 操控日期