SwiftUI自定义NumberFormatter报错解析:Double需继承NSObject的解决
错误含义解析
这个错误的本质是:SwiftUI的Text(_:formatter:)初始化方法要求第一个参数必须是**NSObject的子类实例**,但你传入的10.0是Swift原生的Double值类型,它并不继承自NSObject,不符合参数要求。另外,NumberFormatter是基于Objective-C的API,只能处理NSNumber这类Objective-C对象,没法直接处理Swift基础值类型。
正确使用自定义格式化器的方法
有两种实用的修复方式:
方式1:把Double转为NSObject子类传入
将Swift的Double包装成NSNumber(它是NSObject的子类),就能满足初始化器的要求:
Text(NSNumber(value: 10.0), formatter: .fooCurrency)
方式2:用Swift风格的格式化写法(推荐)
利用SwiftUI为数值类型提供的formatted相关方法,更贴合Swift的使用习惯。如果要复用你的自定义fooCurrency,可以调整一下实现方式:
// 调整自定义格式化器为SwiftUI的FormatStyle扩展 extension FormatStyle where Self == FloatingPointFormatStyle<Double>.Currency { static var fooCurrency: Self { let style = FloatingPointFormatStyle<Double>.currency // 可以在这里添加自定义配置,比如指定货币、区域 return style(code: "CNY").locale(Locale(identifier: "zh_CN")) } } // 使用时直接传format参数 Text(10.0, format: .fooCurrency)
如果你想保留原来基于NumberFormatter的实现,也可以这样写:
Text(10.0.formatted(.init(numberFormatter: .fooCurrency)))
另外,建议给你的fooCurrency补充默认配置,比如指定区域和货币代码,避免不同设备环境下显示不一致:
extension Formatter { static var fooCurrency: NumberFormatter { let formatter = NumberFormatter() formatter.numberStyle = .currency formatter.locale = Locale(identifier: "zh_CN") // 比如指定中文区域 formatter.currencyCode = "CNY" // 指定人民币货币代码 return formatter } }
内容的提问来源于stack exchange,提问作者user19037628
相关产品推荐
相关产品推荐

