您可以將靜態成員添加到類擴展中,就像在類上一樣。您需要在使用它時將類名前綴添加到靜態成員名稱,例如NSDate.dateFormatterUTC
,即使你在同一個班級使用它。
這工作:
extension NSDate {
private static let dateFormatterUTC: NSDateFormatter = {
let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss ZZZ"
formatter.timeZone = NSTimeZone(abbreviation: "UTC")
return formatter
}()
public var UTC : String {
return NSDate.dateFormatterUTC.stringFromDate(self)
}
}
它也不是世界上最糟糕的事情只是使用私人常數:
private let dateFormatterUTC: NSDateFormatter = {
let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss ZZZ"
formatter.timeZone = NSTimeZone(abbreviation: "UTC")
return formatter
}()
extension NSDate {
public var UTC : String {
return dateFormatterUTC.stringFromDate(self)
}
}
這不是比靜態類成員顯著更糟,因爲斯威夫特的private
是文件私人,而不是類型私人。 dateFormatterUTC
這兩個聲明具有相同的範圍。即使在第一個例子中,NSDate.dateFormatterUTC
在整個聲明的文件中都是可訪問的。
我確實同意靜態版本更可取,但僅限於文體原因:我喜歡它的縮進方式,它。
由於Gwendal wisely notes above,此方法假設UTC
將永遠只能從一個線程調用。儘管static let
和全局let
在Swift中都是線程安全的,
NSDateFormatter
類不是!
看起來像it’s threadsafe starting in iOS 7。唷。
不過,在任何提及單身人士旁邊總是保持線程安全警告。如果您確實想要使用來自多個線程的非線程安全幫助程序對象,請考慮在每次調用時創建一個新的幫助程序,或者使用NSThread.currentThread().threadDictionary
來創建每個線程實例。在選擇更復雜的線程本地選項之前,一定要做一點分析以確保實際解決性能問題。
Apple在https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/ThreadSafetySummary/ThreadSafetySummary.html中說道:「以下類和函數通常不是線程安全的,在大多數情況下,你可以從任何線程使用這些類,只要你一次只從一個線程使用它們... NSDateFormatter ...「 –
實際上,https://developer.apple.com/library/mac/documentation/ (1)在iOS 7和更高版本上NSDateFormatter是線程安全的, (2)在OS X v10上。(2)在OS X v10上安裝NSDateFormatter9和更高版本NSDateFormatter是線程安全的,只要您在64位應用程序中使用現代行爲,即可使用 ;(3)在早期版本的操作系統上,或者在使用舊格式化器行爲或在32位在OS X上,NSDateFormatter不是線程安全的,因此您不能同時從多個線程中變更日期格式化程序。 –
很酷,謝謝@ ramsay諮詢。那是一種解脫。 –