为什么NumberFormatter的字符串(来自:)返回一个可选的?

文档链接

为什么NumberFormatter函数func string(from number: NSNumber) -> String? 返回一个String? 而不是一个StringNumberFormatter是否有特定的输入或状态,此函数可以返回nil? 有时我听说这些不太理想的返回类型来自Objective-C保持文件,这是其中一种情况吗?

在Apple邮件列表上有一个古老的(2002年)回复,可能会部分回答你的问题:

奇怪的行为不是NSNumber – NSNumber -stringValue似乎正在返回人们期望的结果。 这是NSNumberFormatter,它返回了不寻常的结果。

这里的抽象问题是NSNumberFormatter最初编写用于处理EOF的金额,因此它不能很好地处理exception数字(或者通用字符串格式化)。

更具体的问题是,当您向NSNumberFormatter询问-stringForObjectValue:时,如果该对象不是NSDecimalNumber,则使用[NSDecimalNumber decimalNumberWithString:[objectValue stringValue]]将其转换为NSDecimalNumber,这不会很好地处理exception值,除了潜在的其他问题。 另一个问题,虽然我不知道是这种情况,但是我不认为存在正负无限的NSDecimal(结构)表示,就像NaN一样。

我实际上并不理解这种反应足以说明这是为什么返回一个可选项,但我怀疑它是相关的。

原始问题中有示例代码,但没有一个返回nil ,它总是给出一个字符串。

只是为了好玩:这是一个(构造的,而不是真实世界)示例,其中string(from:)实际返回nil

 let num = NSNumber(bytes: UnsafeRawPointer(bitPattern: 1)!, objCType: "v") print(num) // <> let fmt = NumberFormatter() fmt.numberStyle = .decimal let str = fmt.string(from: num) print(str as Any) // nil 

原因是此num不表示数字:它是使用NSValue (从中inheritance)初始化程序init(bytes:objCType:) ,其值为void 。 (“v”是void的类型编码 ,指针值无关紧要。)