Swift:如何用静态属性实现自定义NumberFormatter的单次初始化访问?
Swift实现全局可直接访问的配置好的NumberFormatter实例
现有如下Swift代码(未考虑线程安全):
class Formatters { static let shared = Formatters() var humaneNumbers: NumberFormatter; private init() { humaneNumbers = NumberFormatter() humaneNumbers.numberStyle = .decimal } }
当前需要通过Formatters.shared.humaneNumbers调用格式化器,希望能直接通过Formatters.humaneNumbers访问。尝试了两种方式,但都存在问题:
- 静态计算属性
class Formatters { static var humaneNumbers: NumberFormatter { let humaneNumbers = NumberFormatter() humaneNumbers.numberStyle = .decimal return humaneNumbers } }
问题:每次访问都会重新创建实例,无法实现单次初始化。
- 静态常量属性
class Formatters { static let humaneNumbers = NumberFormatter() }
问题:无法对NumberFormatter进行自定义配置。
可行的实现方式
最简洁且满足需求的方案是静态常量+闭包初始化,利用Swift静态存储属性的惰性初始化特性:
class Formatters { static let humaneNumbers: NumberFormatter = { let formatter = NumberFormatter() formatter.numberStyle = .decimal // 可在此添加更多自定义配置,例如: // formatter.locale = Locale(identifier: "zh_CN") // formatter.minimumFractionDigits = 0 return formatter }() }
这种方式的优势:
- 直接通过
Formatters.humaneNumbers访问,无需依赖单例实例 - 仅在第一次访问时执行闭包内的配置与实例化逻辑,后续访问复用同一个实例
- Swift会自动保证静态存储属性初始化的线程安全性,无需额外处理
内容的提问来源于stack exchange,提问作者Steven Fisher
相关产品推荐
相关产品推荐

