借助PropertyWrapper自动创建/销毁那些开销较大的Formatter

最近项目中涉及到格式化数字的功能,因为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
喜欢就支持一下吧
点赞0 分享