Literals in Swift do not inherently have a type (at least conceptually). They are simply literals.
The compiler will interpret them as whatever ExpressibleBy_____Literal type is required to make the expression sensible. There are default types which literals will become if no type information is available: a string literal becomes String, a floating point literal becomes Double, and so forth. But the literals themselves do not have a type, and will become whatever type makes sense in context. Nevin On Mon, Nov 14, 2016 at 4:59 PM, Chris Anderson via swift-users < swift-users@swift.org> wrote: > Thanks for that follow up, I’m still a little confused at why one > direction works and the other does not, but I’m getting there. > > I’ve found another issue I’ll bug report, but it’s along the same lines > and wanted to run it by this thread. If I have an NSDecimalNumber, in > Swift, and perform math on a literal value, (product) the code compiles. If > I assign that value to a variable, or use any of the other Decimal/Double > types, I cannot compile. I would expect a Double to not work, but I would > expect ‘Decimal’ to work, in this case, as I’m not crossing the Objective C > border. And, I’m confused how using the literal ‘2.0’ is interpreted as an > NSDecimalNumber, and works in the ‘product’ stop, but I would expect the > compiler to try and make it into a Double, as it does on the ‘test’ > variable. > > let value = NSDecimalNumber(value: 2) > let test = 2.0 // > double > let product = value.multiplying(by: 2.0) // compiles > let x = value.multiplying(by: Decimal(2.0)) // does not compile > let y = value.multiplying(by: Double(2.0)) // does not compile > let z = value.multiplying(by: test) // does not > compile > > Best, > Chris Anderson > > On Nov 11, 2016, at 6:07 PM, Philippe Hausler <phaus...@apple.com> wrote: > > > NSDecimal is not toll free bridged, but it does have a bridge to > NSDecimalNumber. > > So take this for example: > > @objc class Exam: NSObject { > var grade: Double = 90.0 > } > > It would be reasonable to expect that is exposed in objc as: > > @interface Exam : NSObject > @property double grade; > @end > > and not: > > @interface Exam : NSObject > @property NSNumber *grade; > @end > > As it stands this is exposing as the structural type since that structural > type comes from objective-c. Unlike String or Dictionary that have direct > counterparts - NSDecimal and NSDecimalNumber both are sourced from the > objective-c headers. That being said an API exposed in objc as returning a > NSDecimalNumber should be exposed into swift as returning a Decimal (the > struct NSDecimal). So if Exam was implemented in objc as such: > > @interface Exam : NSObject > @property NSDecimalNumber *grade; > @end > > that should be imported into swift as: > > class Exam : NSObject { > var grade : Decimal > } > > On Nov 11, 2016, at 2:58 PM, Adam C. Lickel via swift-users < > swift-users@swift.org> wrote: > > NSDecimal has toll-free bridging with NSDecimalNumber so you can still do > as casting when talking to an Objective-C API. > > On Nov 11, 2016, at 2:56 PM, Chris Anderson via swift-users < > swift-users@swift.org> wrote: > > Sure thing. Yeah, ideally the bridging would be fixed, but at the least, > correcting the documentation will be a good start. Will file, thanks. > > Best, > Chris Anderson > > On Nov 11, 2016, at 5:55 PM, Tony Parker <anthony.par...@apple.com> wrote: > > Hi Chris, > > Can you file a radar or JIRA for us on this? It looks like something > should be fixed in the documentation at least, or perhaps in the bridging. > > - Tony > > On Nov 11, 2016, at 1:46 PM, Chris Anderson via swift-users < > swift-users@swift.org> wrote: > > I'm having problems with the type conversion between a Swift `Decimal` and > an Objective C `NSDecimalNumber`. > > If I have the Swift class: > > @objc class Exam: NSObject { > var grade: Decimal = 90.0 > } > > And try to use that Swift class in Objective C, > > Exam *exam = [[Exam alloc] init]; > NSDecimalNumber *result = [[NSDecimalNumber zero] > decimalNumberByAdding:grade.value]; > > I get the error: > > Sending 'NSDecimal' to parameter of incompatible type 'NSDecimalNumber * > _Nonnull' > > as it seems like `grade` is being treated as an `NSDecimal` not an > `NSDecimalNumber`. This seems incorrect as per > https://developer.apple.com/reference/foundation/nsdecimalnumber it says > > "The Swift overlay to the Foundation framework provides the Decimal > structure, which bridges to the NSDecimalNumber class. The Decimal value > type offers the same functionality as the NSDecimalNumber reference type, > and the two can be used interchangeably in Swift code that interacts with > Objective-C APIs. This behavior is similar to how Swift bridges standard > string, numeric, and collection types to their corresponding Foundation > classes." > > So I'm not sure if 1) I'm doing something wrong. 2) there's an error in > the documentation or 3) this is a Swift bug. Number 1 on that list is > definitely the most likely, but I wanted to see what I’m missing here. > > I don't want to explicitly make the values in my Swift class > `NSDecimalNumber` because then I cannot do simple arithmetic operations > such as `+` without doing the whole ugly `decimalNumberByAdding` dance. > > Thanks for the help! > > Best, > Chris Anderson > _______________________________________________ > swift-users mailing list > swift-users@swift.org > https://lists.swift.org/mailman/listinfo/swift-users > > > > _______________________________________________ > swift-users mailing list > swift-users@swift.org > https://lists.swift.org/mailman/listinfo/swift-users > > > _______________________________________________ > swift-users mailing list > swift-users@swift.org > https://lists.swift.org/mailman/listinfo/swift-users > > > > > _______________________________________________ > swift-users mailing list > swift-users@swift.org > https://lists.swift.org/mailman/listinfo/swift-users > >
_______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users