使 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() 静态的主要内容,如果未能解决你的问题,请参考以下文章