众所周知,创建 NSDateFormatters 是“昂贵的”
甚至 Apple 的数据格式指南(2014-02 更新)也指出:
创建日期格式化程序并不是一项廉价的操作。如果您可能经常使用格式化程序,则缓存单个实例通常比创建和处置多个实例更有效。一种方法是使用静态变量。
但是该文档似乎并没有真正与 swift 保持同步,而且我在最新的NSDateFormatter 类参考中也找不到任何关于缓存格式化程序的信息,所以我只能假设 swift 和 Objective-c 一样昂贵.
许多消息来源建议在使用它的类中缓存格式化程序,例如控制器或视图。
我想知道在项目中添加一个单例类来存储日期选择器是否方便甚至“便宜”,这样您就可以放心,永远不需要再次创建它。这可以在应用程序的任何地方使用。您还可以创建多个包含多个日期选择器的共享实例。例如,一个用于显示日期的日期选择器和一个用于时间符号的日期选择器:
class DateformatterManager {
var formatter = NSDateFormatter()
class var dateFormatManager : DateformatterManager {
struct Static {
static let instance : DateformatterManager = DateformatterManager()
}
// date shown as date in some tableviews
Static.instance.formatter.dateFormat = "yyyy-MM-dd"
return Static.instance
}
class var timeFormatManager : DateformatterManager {
struct Static {
static let instance : DateformatterManager = DateformatterManager()
}
// date shown as time in some tableviews
Static.instance.formatter.dateFormat = "HH:mm"
return Static.instance
}
// MARK: - Helpers
func stringFromDate(date: NSDate) -> String {
return self.formatter.stringFromDate(date)
}
func dateFromString(date: String) -> NSDate? {
return self.formatter.dateFromString(date)!
}
}
// Usage would be something like:
DateformatterManager.dateFormatManager.dateFromString("2014-12-05")
另一种类似的方法是只创建一个单例并根据需要切换格式:
class DateformatterManager {
var formatter = NSDateFormatter()
var dateFormatter : NSDateFormatter{
get {
// date shown as date in some tableviews
formatter.dateFormat = "yyyy-MM-dd"
return formatter
}
}
var timeFormatter : NSDateFormatter{
get {
// date shown as time in some tableviews
formatter.dateFormat = "HH:mm"
return formatter
}
}
class var sharedManager : DateformatterManager {
struct Static {
static let instance : DateformatterManager = DateformatterManager()
}
return Static.instance
}
// MARK: - Helpers
func dateStringFromDate(date: NSDate) -> String {
return self.dateFormatter.stringFromDate(date)
}
func dateFromDateString(date: String) -> NSDate? {
return self.dateFormatter.dateFromString(date)!
}
func timeStringFromDate(date: NSDate) -> String {
return self.timeFormatter.stringFromDate(date)
}
func dateFromTimeString(date: String) -> NSDate? {
return self.timeFormatter.dateFromString(date)!
}
}
// Usage would be something like:
var DateformatterManager.sharedManager.dateFromDateString("2014-12-05")
其中任何一个是一个好主意还是一个可怕的主意?转换格式也很昂贵吗?
更新: 正如Hot Licks和Lorenzo Rossi指出的那样,切换格式可能不是一个好主意(不是线程安全的,而且与重新创建一样昂贵......)。