问题描述
我想将DateFormatter
设为静态,因为创建DateFormatter
是一项昂贵的操作。我不知道该如何实现?
extension Date {
func toString(format: String = "yyyy-MM-dd") -> String {
let formatter = DateFormatter()
formatter.dateStyle = .short
formatter.dateFormat = format
return formatter.string(from: self)
}
func dateAndTimetoString(format: String = "yyyy-MM-dd HH:mm") -> String {
let formatter = DateFormatter()
formatter.dateStyle = .short
formatter.dateFormat = format
return formatter.string(from: self)
}
}
解决方法
我这样做:
import Foundation
enum Formatters {
static private var numberFormatter: NumberFormatter = {
let nf = NumberFormatter()
nf.numberStyle = .decimal
return nf
}()
static private var percentageFormatter: NumberFormatter {
let nf = NumberFormatter()
nf.numberStyle = .percent
nf.minimumFractionDigits = 1
nf.minimumFractionDigits = 1
return nf
}
static private var memoryColumnFormatter: ByteCountFormatter = {
let bcf = ByteCountFormatter()
bcf.countStyle = .memory
bcf.allowsNonnumericFormatting = false
bcf.formattingContext = .listItem
return bcf
}()
// Mark: Convenience overloads
// I really wish NSNumebr had an initializer that took a generic BinaryInteger
static func format(number: Int32) -> String {
return self.format(number: NSNumber(value: number))
}
static func format(number: UInt32) -> String {
return self.format(number: NSNumber(value: number))
}
static func format(pointer: UInt64) -> String {
"0x" + String(pointer,radix: 16,uppercase: true,width: 16)
}
static func format(percentage: Double) -> String {
return percentageFormatter.string(from: NSNumber(value: percentage))!
}
static func format(byteCountForMemoryColumn byteCount: UInt64) -> String {
return memoryColumnFormatter.string(fromByteCount: Int64(byteCount))
}
static func format(number: NSNumber) -> String {
return numberFormatter.string(from:number)!
}
}
,
使用立即执行的闭包静态创建一个
extension Date {
static var myFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateStyle = .short
return formatter
}()
}