我正在尝试使用NumberFormatterSwift 3 Decimal,但我对如何Decimal实现真正感到困惑.我遇到的问题是这Decimal是一个结构,所以NSDecimalNumber每次我想使用格式化程序时我都必须将它连接起来,我想避免使用它.
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
let decimal = Decimal(integerLiteral: 3)
let string = formatter.string(from: decimal as NSDecimalNumber)
Run Code Online (Sandbox Code Playgroud)
这是实现我自己的扩展需要一个理想的解决方法Decimal吗?
extension NumberFormatter {
open func string(from number: Decimal) -> String? {
return string(from: number as NSDecimalNumber)
}
}
Run Code Online (Sandbox Code Playgroud)
更一般地说,每次我需要传入一个对象类型我是否需要桥接Decimal或编写更多扩展?
编辑
我想我更喜欢NSDecimal Decimal和NSDecimalNumberSwift 3一样.我根本不清楚这里发生了什么.我应该替换NSDecimalNumber用Decimal的斯威夫特3?文档写道:
Swift覆盖到Foundation框架提供了Decimal结构,该结构桥接到NSDecimalNumber类.Decimal值类型提供与NSDecimalNumber引用类型相同的功能,并且这两者可以在与Objective-C API交互的Swift代码中互换使用.此行为类似于Swift如何将标准字符串,数字和集合类型桥接到其对应的Foundation类.
起初我以为意味着Decimal是新的NSDecimalNumber一样Error是新的NSError-但现在我不那么肯定.这也说'十进制值类型提供与NSDecimalNumber引用类型相同的功能' - 这是真的吗?我似乎无法获得相同的功能(首先没有桥接,当然,这是他们的意思吗?).我在这里和那里找到了一些帖子和一些信息,但没有任何令人信服的信息.有没有人有任何知识或见解?
我的应用程序专门NSDecimalNumber用于货币和格式,因此舍入和格式化是一个高优先级.
Ale*_*lex 28
我在快速用户板上问了我的问题并得到了一个很好的答案,请在这里查看:https://lists.swift.org/pipermail/swift-users/Week-of-Mon-20161219/004220.html
回复的文字版本:
Swift 3引入了Decimal类,起初我认为它应该在Swift中"替换"NSDecimalNumber,比如Error是新的NSError等.但是,经过进一步的调查,我不清楚实际情况是这样的.似乎Swift 3的Decimal更像是一个NSDecimal,但是有一些桥接,所以它可以在需要时使用NSDecimalNumber的方法.我想知道的是,我应该用我的应用程序替换Decimal中的NSDecimalNumber吗?Decimal是Swift中NSDecimalNumber的继承者吗?
Decimal实际上它是一个结构,而不是一个类,实际上它只是NSDecimalObjective-C中结构的Swift名称.在Swift中,类似NSDecimalAdd的函数作为运算符公开,Decimal并用于满足各种数字协议的要求SignedNumber.
最终结果是Decimal很像Int或者Double-it是一种值类型,可以方便地用于进行各种数学运算.NSDecimalNumber那么,相当于NSNumber.
由于我的应用程序正在进行大量格式化,因此需要在Decimal和NSDecimalNumber之间进行大量渲染,或者添加要使用的扩展,因此我认为没有很多扩展会自然/方便.Swift是否计划使用NumberFormatter或其他面向对象的数字API来提高Decimal的可用性?希望我已经提供了足够的信息来回答我的问题.
使用的Objective-C API NSDecimalNumber应该被桥接到Decimal,就像NSString桥接一样String.但是,这种桥接可能不适用于类别方法; 你可以写上延伸揭露那些斯威夫特Decimal其投射self到NSDecimalNumber,然后通过调用你的Objective-C的方法.
同样的,你应该能够使用Decimal与NumberFormatter通过强制转换NSDecimalNumber,就像你会投Int或Double以NSNumber将它们与使用NumberFormatter.
| 归档时间: |
|
| 查看次数: |
13803 次 |
| 最近记录: |