【发布时间】:2016-12-14 17:36:59
【问题描述】:
我正在尝试将 NumberFormatter 与 Swift 3 Decimal 一起使用,但我对 Decimal 的实际实现方式感到困惑。我遇到的问题是Decimal 是一个结构,所以每次我想使用格式化程序时,我都必须将它桥接到NSDecimalNumber,我想避免这种情况。
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
let decimal = Decimal(integerLiteral: 3)
let string = formatter.string(from: decimal as NSDecimalNumber)
实现我自己的采用Decimal 的扩展是理想的解决方法吗?
extension NumberFormatter {
open func string(from number: Decimal) -> String? {
return string(from: number as NSDecimalNumber)
}
}
更一般地说,每次我需要传入一个对象类型时,我是否需要桥接Decimal 或编写更多扩展?
编辑
我想我更普遍地想知道 Swift 3 中的 NSDecimal Decimal 和 NSDecimalNumber。我完全不清楚这里发生了什么。对于 Swift 3,我应该用 Decimal 替换 NSDecimalNumber 吗?文档写道:
Foundation 框架的 Swift 覆盖提供了 Decimal 结构,它连接到 NSDecimalNumber 类。 Decimal 值类型提供与 NSDecimalNumber 引用类型相同的功能,并且两者可以在与 Objective-C API 交互的 Swift 代码中互换使用。这种行为类似于 Swift 如何将标准字符串、数字和集合类型桥接到它们相应的 Foundation 类。
起初我以为Decimal 是新的NSDecimalNumber,就像Error 是新的NSError - 但现在我不太确定了。这还说“十进制值类型提供与 NSDecimalNumber 引用类型相同的功能”——这真的是真的吗?我似乎无法获得很多相同的功能(当然,如果不先桥接它,这就是他们的意思吗?)。我在这里和那里找到了一些帖子和一些信息,但没有什么令人信服的。有没有人有任何知识或见解?
我的应用专门使用 NSDecimalNumber 进行货币和格式设置,因此舍入和格式设置是一个高优先级。
【问题讨论】:
-
据我所见,
NumberFormatter(style: .decimal)不会编译,而且NumberFormatter()不会创建一个可选项。 – 这是你的真实代码,还是我忽略了什么? -
extension NumberFormatter { convenience init(style: NumberFormatter.Style) { self.init() self.numberStyle = style } func string(from decimal: Decimal) -> String? { return string(from: decimal as NSNumber) } } -
是的,这是我的真实代码,它编译得很好。我在 Xcode 8.1 上,这在 8.2 中是否发生了变化?
-
在 Xcode 8.1 中无法为我编译,因为没有这样的初始化程序。
-
对不起,我们有一个简单的 NSNumberFormatter 扩展,代码已经更新