【发布时间】:2016-11-11 21:41:33
【问题描述】:
我遇到了 Swift Decimal 和 Objective C NSDecimalNumber 之间的类型转换问题。
如果我有 Swift 类:
@objc class Exam: NSObject {
var grade: Decimal = 90.0
}
并尝试在 Objective C 中使用那个 Swift 类,
Exam *exam = [[Exam alloc] init];
NSDecimalNumber *result = [[NSDecimalNumber zero] decimalNumberByAdding:grade.value];
我得到错误:
Sending 'NSDecimal' to parameter of incompatible type 'NSDecimalNumber * _Nonnull'
似乎grade 被视为NSDecimal 而不是NSDecimalNumber。根据 所说,这似乎不正确
Foundation 框架的 Swift 覆盖提供了 Decimal 结构,它连接到 NSDecimalNumber 类。十进制 值类型提供与 NSDecimalNumber 相同的功能 引用类型,两者在 Swift 代码中可以互换使用 与 Objective-C API 交互。这种行为类似于 Swift 将标准字符串、数字和集合类型连接到它们的 相应的基础类。
所以我不确定 1) 我做错了什么。 2) 文档中有错误或 3) 这是一个 Swift 错误。
我不想在我的 Swift 类 NSDecimalNumber 中显式地创建值,因为这样我就不能在不做整个丑陋的 decimalNumberByAdding 舞蹈的情况下进行简单的算术运算,例如 +。
【问题讨论】:
-
据我所知,
NSDecimalNumber在 Objective-C 和 Swift 中是一样的,而在 ObjC 中的NSDecimal在 Swift 中是Decimal。您可以在 Swift 中对它们进行转换,但 Swift 不会自动在 ObjC 中的NSDecimalNumber和 Swift 中的Decimal之间进行桥接(就像其他覆盖类型一样)。这可能是文档中的错误或错误。 -
这里有类似的混淆:stackoverflow.com/questions/39890795/….
-
该文档完全暗示了我所期望的行为,不是吗? “Decimal 值类型提供与 NSDecimalNumber 引用类型相同的功能,并且两者可以在与 Objective-C API 交互的 Swift 代码中互换使用”。可能会报告错误。
标签: objective-c swift swift3