Ios 为什么NumberFormatter';s字符串(从:)是否返回可选值?

Ios 为什么NumberFormatter';s字符串(从:)是否返回可选值?,ios,swift,Ios,Swift,为什么NumberFormatter函数func string(从编号:NSNumber)->string?返回的是字符串而不是字符串?NumberFormatter是否有特定的输入或状态,该函数可以返回nil?有时我听说这些不太理想的返回类型来自Objective-C延期文件,这是其中之一吗?有一个古老的(2002年)回答可能部分回答了您的问题: 奇怪的行为不是NSNumber——NSNumber-stringValue似乎返回了人们期望的结果。返回异常结果的是NSNumberFormatte

为什么
NumberFormatter
函数
func string(从编号:NSNumber)->string?
返回的是
字符串而不是
字符串
NumberFormatter
是否有特定的输入或状态,该函数可以返回nil?有时我听说这些不太理想的返回类型来自Objective-C延期文件,这是其中之一吗?

有一个古老的(2002年)回答可能部分回答了您的问题:

奇怪的行为不是NSNumber——NSNumber-stringValue似乎返回了人们期望的结果。返回异常结果的是NSNumberFormatter

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

更具体的问题是,当您向NSNumberFormatter请求-stringForObjectValue:,如果对象不是NSDecimalNumber,它会使用 [NSDecimalNumber decimalNumberWithString:[objectValue stringValue]] 除了潜在的其他问题外,它不会很好地处理异常值。另一个问题,虽然我不知道是这样的,但我不认为有正反无限的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
let num=NSNumber(字节:UnsafeRawPointer(位模式:1)!,对象类型:“v”)
打印(数字)//
设fmt=NumberFormatter()
fmt.numberStyle=.decimal
让str=fmt.string(from:num)
打印(str作为任意项)//nil
原因是此
num
不代表数字:它是创建的 使用
NSValue
(从中继承)初始值设定项 用一个值表示
无效
。(“v”表示
无效

指针值是不相关的。)

我认为可以这样说,如果您尝试使用NumberFormatter将公共类型(如Double)格式化为字符串,它将无法返回
nil

在我看来,这是为数不多的强制展开选项具有完美意义的情况之一

func formatToDecimalNumber(_ value: Double) -> String {
    let formatter = NumberFormatter()
    formatter.numberStyle = .decimal
    formatter.minimumFractionDigits = 0
    formatter.maximumFractionDigits = 2
    formatter.locale = Locale.current
    return formatter.string(from: NSNumber(value: value))!
}

相关:@vadian谢谢。我想,实际上,我在这里是想问,我是否可以凭良心随时打开这些声明,而这篇文章让我倾向于“是”。@vadian:事实上,这是相同的问题。(答案并不完全令人满意。)@Martin这就是为什么我没有将其标记为重复最相关的部分似乎是“当您向NSNumberFormatter询问-stringForObjectValue:,如果对象不是NSDecimalNumber,它将使用[NSDecimalNumber DecimalNumber WithString:[objectValue stringValue]将其转换为NSDecimalNumber”]这不会很好地处理异常值”。这听起来像是有一个实现细节,可能导致Obj-C用例中的空值,但不是Swift。感谢您的挖掘!这是一个比我预想的更有趣的答案。干杯,这是一个有趣的问题。也许苹果的一些工程师对NaN是否应该为零有过争论,他们妥协了一个可选值。你怎么知道这些?!尼斯:)