十进制作为NSDecimal导入而不是Swift 3中的NSDecimalNumber到Objective C.

时间:2016-11-11 21:41:34

标签: objective-c swift swift3

我遇到了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>

1 个答案:

答案 0 :(得分:1)

似乎DecimalNSDecimalNumber的过渡功能不起作用StringNSString,或ArrayNSArray。但它更像IntNSNumber

您不希望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];
相关问题