Десятичное число, импортированное как NSDecimal, а не NSDecimalNumber в Swift 3 в Objective C

У меня проблемы с преобразованием типов между Swift Decimal и цель C NSDecimalNumber,

Если у меня есть класс Swift:

@objc class Exam: NSObject {
    var grade: Decimal = 90.0
}

И попробуйте использовать этот класс Swift в Objective C,

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

Я получаю ошибку:

Sending 'NSDecimal' to parameter of incompatible type 'NSDecimalNumber * _Nonnull'

как кажется grade рассматривается как NSDecimal не NSDecimalNumber, Это кажется неправильным согласно это говорит

Наложение Swift на платформу Foundation предоставляет структуру Decimal, которая соединяется с классом NSDecimalNumber. Тип десятичного значения предлагает те же функциональные возможности, что и ссылочный тип NSDecimalNumber, и эти два можно использовать взаимозаменяемо в коде Swift, который взаимодействует с API-интерфейсами Objective-C. Это поведение аналогично тому, как Swift соединяет стандартные строковые, числовые типы и типы коллекций с соответствующими им базовыми классами.

Так что я не уверен, если 1) я делаю что-то не так. 2) В документации есть ошибка или 3) Это ошибка Swift.

Я не хочу явно делать значения в моем классе Swift NSDecimalNumber потому что тогда я не могу делать простые арифметические операции, такие как + не делая всего безобразного decimalNumberByAdding танец.

1 ответ

Решение

Кажется, соединяющая особенность Decimal а также NSDecimalNumber не работает как String а также NSString, или же Array а также NSArray, Но это больше похоже на Int а также NSNumber,

Вы бы не ожидали Int свойства в Swift могут быть доступны как NSNumber в Objective-C.

Как насчет добавления геттера для использования с 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];
Другие вопросы по тегам