Swift 3 Decimal NSDecimal NSDecimalNumber


(Alex Thurston) #1

Hello, this is my first message to swift-users so please let me know if I should be doing anything differently.

I'm working with an app that already uses NSDecimalNumber, mostly for currency and formatting, and we have many extensions for NSDecimalNumber written in Obj-C.

Swift 3 introduced the Decimal class, which at first I thought was supposed to 'replace' NSDecimalNumber in Swift, like Error is the new NSError, etc. However, upon further investigation, it's not clear to me that this is actually the case. It appears that Swift 3's Decimal is more just an NSDecimal, but with some bridging so it can use NSDecimalNumber's methods when needed. What I'm wondering is, should I be replacing NSDecimalNumber in my app with Decimal? Is Decimal the successor to NSDecimalNumber in Swift? Since my app is doing a lot of formatting, it would require much casting between Decimal and NSDecimalNumber, or adding of extensions to use, so I don't think it would be natural/convenient without many extensions. Is Swift planning to improve Decimal to be more usable with NumberFormatter, or other object-oriented number APIs? Hopefully I have given enough information to answer my question.

Thank you

Alex Thurston
athurston@icsusa.com

Confidentiality Notice:
This e-mail, including any attachments, contains information that maybe confidential or privileged. The information is intended to be for the use of the individual or entity named above. If you are not the intended recipient, be aware that any disclosure, copying, distribution, or use of the contents is prohibited. If you have received this e- mail in error, please notify the sender immediately by a “reply to sender only” message and destroy all electronic and hard copies of the communication, including attachments.


(Brent Royal-Gordon) #2

Swift 3 introduced the Decimal class, which at first I thought was supposed to 'replace' NSDecimalNumber in Swift, like Error is the new NSError, etc. However, upon further investigation, it's not clear to me that this is actually the case. It appears that Swift 3's Decimal is more just an NSDecimal, but with some bridging so it can use NSDecimalNumber's methods when needed. What I'm wondering is, should I be replacing NSDecimalNumber in my app with Decimal? Is Decimal the successor to NSDecimalNumber in Swift?

`Decimal` is actually a struct, not a class, and in fact it's just the Swift name for the `NSDecimal` struct in Objective-C. In Swift, functions like `NSDecimalAdd` are exposed as operators on `Decimal` and are used to satisfy the requirements of various numeric protocols like `SignedNumber`.

The end result is that `Decimal` is a lot like `Int` or `Double`—it's a value type which can be conveniently used to do all sorts of math. `NSDecimalNumber`, then, is equivalent to `NSNumber`.

Since my app is doing a lot of formatting, it would require much casting between Decimal and NSDecimalNumber, or adding of extensions to use, so I don't think it would be natural/convenient without many extensions. Is Swift planning to improve Decimal to be more usable with NumberFormatter, or other object-oriented number APIs? Hopefully I have given enough information to answer my question.

Objective-C APIs which use `NSDecimalNumber` should be bridged to `Decimal`, just as `NSString` is bridged to `String`. That bridging may not work for category methods, though; you could expose those to Swift by writing an extension on `Decimal` which casts `self` to `NSDecimalNumber` and then calls through to your Objective-C methods.

Similarly, you should be able to use `Decimal` with `NumberFormatter` by casting to `NSDecimalNumber`, just as you would cast `Int` or `Double` to `NSNumber` to use them with `NumberFormatter`.

···

On Dec 20, 2016, at 8:32 AM, Alex Thurston via swift-users <swift-users@swift.org> wrote:

--
Brent Royal-Gordon
Architechies