使DateFormatter静态

问题描述

我想将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
   }()
}