【问题标题】:Decimal imported as NSDecimal not NSDecimalNumber in Swift 3 to Objective C在 Swift 3 中作为 NSDecimal 而不是 NSDecimalNumber 导入到 Objective C 的十进制
【发布时间】: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


【解决方案1】:

似乎DecimalNSDecimalNumber 的桥接功能不像StringNSString,或ArrayNSArray 那样工作。但它更像IntNSNumber

您不会期望 Swift 中的 Int 属性可以像 Objective-C 中的 NSNumber 一样访问。

添加一个 getter 用于 Objective-C 怎么样:

extension Exam {
    @objc var gradeValue: NSDecimalNumber {
        return grade as NSDecimalNumber
    }
}

你可以在 Objective-C 中这样使用它:

Exam *exam = [[Exam alloc] init];
NSDecimalNumber *result = [[NSDecimalNumber zero] decimalNumberByAdding:exam.gradeValue];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 2011-03-15
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多