Подтвердить что ты не робот

Может ли 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 через мосты?

4b9b3361

Ответ 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
}