Ram*_*ing 4 date nsdateformatter swift
在这里的几个地方,有人建议在扩展名中使用计算属性NSDate
可能是通过a获取日期的字符串版本的好方法NSDateFormatter
,如下所示:
extension NSDate {
public var UTC : String {
let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss ZZZ"
formatter.timeZone = NSTimeZone(abbreviation: "UTC")
return formatter.stringFromDate(self)
}
}
Run Code Online (Sandbox Code Playgroud)
但是,分配a NSDateFormatter
很昂贵,建议创建一次并缓存它们.上面的代码创建了NSDateFormatter
每次格式化日期时,我想知道是否有一种方法可以NSDateFormatter
在扩展内部创建一次以供重用?
显然,我可以在扩展之外创建它一次,但这似乎打败了表征类的封装.
我想起了:https://xkcd.com/1179/ !!
您可以将静态成员添加到类扩展,就像在类上一样.您需要在使用时将类名称作为静态成员名称的前缀,例如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)
}
}
Run Code Online (Sandbox Code Playgroud)
使用私有常量也不是世界上最糟糕的事情:
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)
}
}
Run Code Online (Sandbox Code Playgroud)
这并不比静态类成员差很多,因为Swift private
是文件私有的,而不是类型私有的.这两个声明dateFormatterUTC
具有相同的范围.即使在第一个示例中,NSDate.dateFormatterUTC
也可以在整个文件中访问它.
我同意静态版本是可取的,但仅出于文体原因:我喜欢它在使用它的东西旁边缩进的方式.
正如Gwendal明智地指出的那样,这种方法假设UTC
只会从一个线程调用.虽然static let
和let
Swift中的全局都是线程安全的,但是从iOS 7开始看起来像是线程安全的.唷.NSDateFormatter
类不是!
仍然,总是很好的保持线程安全警告旁边提到单身人士.如果您确实想要使用来自多个线程的非线程安全帮助程序对象,请考虑在每次调用时创建新的帮助程序,或者使用NSThread.currentThread().threadDictionary
创建每个线程的实例.在选择更复杂的线程局部选项之前,请务必进行一些分析以确保实际解决性能问题.
归档时间: |
|
查看次数: |
2093 次 |
最近记录: |