Может ли Swift Option Int (Int?) Быть подвержен Objective-C через мосты?
В классе Swift, полученном из основанной на Obj-C фреймворка (но так же легко может быть класс Swift с атрибутом @objc), я объявляю два сохраненных свойства:
var optInt: Int?
var optString: String?
Только optString подвергается Obj-C через сгенерированный заголовок -Swift.h.
Строка? по-видимому, прекрасен, потому что он отображается с использованием объекта NSString, который может быть равен нулю, поэтому мостик имеет способ не представлять значения.
Если я удалю? от optInt он подвергается воздействию типа NSInteger, поэтому я вижу, что для не необязательных целых чисел он избегает объектов типа объектов и мостов для типа значений, но означает ли это, что Int? не может быть выставлен?
Я не могу найти какую-либо документацию, в которой явным образом говорится, что это так. Существует целый список несовместимых функций Swift, которые здесь не отображаются: Использование Swift из Objective-C
Здесь используется классическая ситуация, требующая прохождения числового идентификатора, который может быть законным равным нулю. В мире Pre-Swift NSNumber и nil - это именно то, как я начал реализовывать это, но просто неправильно пытаться перенести класс в Swift, но затем, по этой причине, висящим на Obj-C типах класса Swift.
Я полагаю, что я предусмотрел, что Int? в отличие от Int, будет мостиком в качестве NSNumber в фоновом режиме, с его потенциально нулевым значением, в котором элемент "не имеет значения" необязательно в Swift.
Есть ли что-то, что мне не хватает здесь? Чтобы повторить, может ли Swift Option Int (Int?) Быть подвержен Objective-C через мосты?
Ответы
Ответ 1
Проблема с предоставлением свойства Int?
как NSNumber*
заключается в том, что вы можете сохранить не Int
-compatible NSNumber
в него из Objective-C.
Вы можете сделать вычисленное свойство NSNumber?
, чтобы обернуть свойство Int?
. Получатель просто возвращает переменную Int?
. Установщик установил переменную Int
из -[NSNumber integerValue]
.
Ответ 2
Здесь конкретный ответ для решения, описанного выше:
private var _number: Int?
public var number: NSNumber? {
get {
return _number as NSNumber?
}
set(newNumber) {
_number = newNumber?.intValue
}
}
// In case you want to set the number in the init
public init(number: NSNumber?) {
_number = number?.intValue
}