使 DateFormatter() 静态

Posted

技术标签:

【中文标题】使 DateFormatter() 静态【英文标题】:Making DateFormatter() Static 【发布时间】:2020-08-21 19:28:18 【问题描述】:

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

【问题讨论】:

我通常使用 Formatters 类,它为我的应用程序所需的所有各种类型的格式化操作提供函数,并为格式化程序本身提供私有静态存储 你能举个例子吗? 与您的问题无关,但在向用户显示日期时不应使用固定的 dateFormat。您应该始终将其显示为本地化。您唯一能做的就是选择显示短、中、长或完整。您应该始终使用 DateFormater 的日期和时间样式属性,而不是固定的 DateFormat。 ***.com/a/28347285/2303865。而且你应该只使用一个或另一个,而不是两个 【参考方案1】:

我会这样做:

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)!
    

【讨论】:

我会扩展 Formatter 抽象类并从属性名称中删除格式化程序。顺便说一句,无需将数字强制为 NSNumber。您可以简单地将 Any 传递给 Formatter string(forL) 方法并创建一个方法。 @LeoDabus 我不会,因为这是多个格式化程序的聚合。子类Formatter 完全不合适,因为它具有完全不同的语义。 从未说过要子类化。 Formatter.number.whatever String(pointer, radix: 16, uppercase: true, width: 16) 声明在哪里? 这并不是真正的意图,它只是结构的一般概念的一个示例。大多数特定代码甚至对大多数应用程序都没有意义。【参考方案2】:

静态创建一个,立即执行闭包

extension Date 
   static var myFormatter: DateFormatter = 
       let formatter = DateFormatter()
       formatter.dateStyle = .short
       return formatter
   ()

【讨论】:

OP:补充一点:这不仅是静态的,而且是懒惰的。因此,如果创建格式化程序的成本很高,那么如果您的代码从未真正调用过Date.myFormatter,您就可以完全免除这笔费用。酷!

以上是关于使 DateFormatter() 静态的主要内容,如果未能解决你的问题,请参考以下文章

swift DateFormatter

Bokeh 表中的条件 DateFormatter

swift DateFormatter

swift DateFormatter

swift DateFormatter

DateFormatter 返回零