为什么NumberFormatter函数func string(from number: NSNumber) -> String?返回String?而不是String?NumberFormatter这个函数返回的位置是否有特定的输入或状态为零?有时我听说这些不太理想的返回类型来自Objective-C保持文件,这是其中一种情况吗?
只是为了好玩:这是一个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
Run Code Online (Sandbox Code Playgroud)
原因是这num并不代表一个数字:它是使用NSValue(从中继承)初始init(bytes:objCType:)值设定项创建的,其
值表示void.("V"是类型的编码为void,该指针值是无关的.)
Apple邮件列表上有一个古老的(2002年)回复,可能会部分回答您的问题:
奇怪的行为不是NSNumber - NSNumber -stringValue似乎正在返回人们期望的结果.这是NSNumberFormatter,它返回了不寻常的结果.
这里的抽象问题是NSNumberFormatter最初编写用于处理EOF的金额,因此它不能很好地处理异常数字(或者通用字符串格式化).
更具体的问题是当你向NSNumberFormatter询问-stringForObjectValue:时,如果对象不是NSDecimalNumber,它会使用[NSDecimalNumber decimalNumberWithString:[objectValue stringValue]]将它转换为NSDecimalNumber,这不会很好地处理异常值,除了潜在的其他问题.另一个问题,虽然我不知道是这种情况,但是我不认为存在正负无限的NSDecimal(结构)表示,就像NaN一样.
我实际上并没有理解这个响应足以说明这是为什么返回一个可选项,但我怀疑它是相关的.
原始问题中有示例代码,但没有一个返回a nil,它总是给出一个字符串.