最近项目中涉及到格式化数字的功能,因为NumberFormatter的开销比较大(DateFormatter也是),所以用泛型和PropertyWrapper来处理NumberFormatter经过一段时间后自动销毁的功能。请大家多多指正。直接上代码:
@propertyWrapper
final class Temporary<T> {
typealias ValueBuilder = () -> T
private var value: T?
private let survivalTime: TimeInterval
private let builder: ValueBuilder
init(wrappedValue: @escaping ValueBuilder, expireIn survivalTime: TimeInterval) {
self.builder = wrappedValue
self.survivalTime = survivalTime
}
var wrappedValue: T {
guard let unwrapped = value else {
let newValue = builder()
value = newValue
GCDTimer.scheduledTimer(delay: .now() + survivalTime, queue: .global(qos: .background)) { _ in
self.value = .none
}
return newValue
}
return unwrapped
}
}
复制代码
然后extension中就可以这么用:
extension Double {
@Temporary<NumberFormatter>(expireIn: .seconds(300))
fileprivate static var sharedNumberFormatter = {
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
numberFormatter.maximumFractionDigits = 2
return numberFormatter
}
var f2: String? {
let number = NSNumber(value: self)
return Self.sharedNumberFormatter.string(from: number)
}
}
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END