Десятичное число, импортированное как 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];