NSDecimalString导致Xcode 16编译器崩溃,如何解决?
解决Xcode 16中
NSDecimalString编译崩溃问题 问题说明
在Xcode 16(版本16A242)中,使用NSDecimalString将Swift Decimal类型转换为非本地化字符串时会触发编译器崩溃,无论使用Swift 5.10还是6.0版本都会出现该问题。根源是Foundation框架内部存在类型不匹配:官方文档标注NSDecimalString返回非可选String,但内部逻辑却将其当作可选类型处理。该问题覆盖iOS和macOS目标平台,而Xcode 15.x中代码可正常运行。
替代解决方案
1. 使用Swift标准库格式化API
直接利用Swift Decimal的原生格式化能力,指定en_US_POSIX区域生成非本地化字符串,完全规避Objective-C桥接的类型问题:
var decimal: Decimal = … // 基础格式化方式 let string = decimal.formatted(.number.locale(Locale(identifier: "en_US_POSIX"))) // 如需自定义精度(比如匹配原NSDecimalString的输出精度) let formatter = NumberFormatter() formatter.locale = Locale(identifier: "en_US_POSIX") formatter.numberStyle = .decimal formatter.maximumFractionDigits = 16 // 根据实际需求调整 let customPrecisionString = formatter.string(from: decimal as NSNumber) ?? ""
2. 转用NSDecimalNumber的API
将Swift Decimal转换为NSDecimalNumber,调用其description(withLocale:)方法生成目标字符串,绕开有问题的NSDecimalString函数:
var decimal: Decimal = … let nsDecimal = NSDecimalNumber(decimal: decimal) let string = nsDecimal.description(withLocale: Locale(identifier: "en_US_POSIX"))
3. 临时强制类型转换(应急用,不推荐)
如果必须保留NSDecimalString调用,可尝试强制转换返回值为非可选String,但此方法依赖编译器桥接行为,稳定性不足,仅建议临时应急:
var decimal: Decimal = … let string = NSDecimalString(&decimal, Locale(identifier: "en_US_POSIX")) as String
注意事项
该问题属于Xcode 16的框架bug,苹果后续版本大概率会修复。在此之前,优先选择前两种方案,避免依赖存在类型不一致问题的NSDecimalString函数。
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

