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

Con*_*nor 10 ios swift

文档链接

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

Mar*_*n R 8

只是为了好玩:这是一个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,该指针值是无关的.)

  • 你怎么知道这一切?!好:) (3认同)

nev*_*ing 6

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

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

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

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

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

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

  • 干杯,这是一个有趣的问题.也许有些苹果公司的工程师对于NaN是否应该为零而有争议,并且他们会选择性地进行攻击.♂️ (2认同)