为什么NumberFormatter的字符串(来自:)返回一个可选的?
文档链接
为什么NumberFormatter
函数func string(from number: NSNumber) -> String?
返回一个String?
而不是一个String
? NumberFormatter
是否有特定的输入或状态,此函数可以返回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
的类型编码 ,指针值无关紧要。)