我遇到了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
。根据{{3}}说明
Swift叠加到Foundation框架提供了Decimal 结构,桥接到NSDecimalNumber类。十进制 value类型提供与NSDecimalNumber相同的功能 引用类型,这两者可以在Swift代码中互换使用 与Objective-C API交互。这种行为与如何相似 Swift将标准字符串,数字和集合类型桥接到它们的 相应的基础课程。
所以我不确定1)我做错了什么。 2)文档中有错误或3)这是一个Swift错误。
我不想在我的Swift类NSDecimalNumber
中显式地创建值,因为那样我就不能执行简单的算术运算,例如+
而不进行整个丑陋的decimalNumberByAdding
舞蹈。 / p>
答案 0 :(得分:1)
似乎Decimal
和NSDecimalNumber
的过渡功能不起作用String
和NSString
,或Array
和NSArray
。但它更像Int
和NSNumber
。
您不希望Swift中的Int
属性可以在Objective-C中作为NSNumber
访问。
如何添加用于Objective-C的getter:
extension Exam {
@objc var gradeValue: NSDecimalNumber {
return grade as NSDecimalNumber
}
}
您可以在Objective-C中使用它:
Exam *exam = [[Exam alloc] init];
NSDecimalNumber *result = [[NSDecimalNumber zero] decimalNumberByAdding:exam.gradeValue];