¿Puede un Swift Opcional Int (Int?) Exponerse a Objective-C a través de un puente?

Dentro de una clase Swift derivada de un marco basado en Obj-C (pero podría ser tan fácilmente una clase Swift con un atributo @objc) declaro dos propiedades almacenadas:

var optInt: Int? var optString: String? 

Solo OptString se expone a Obj-C a través del encabezado -Swift.h generado.

¿Cuerda? presumiblemente está bien porque está expuesto usando un objeto NSString que puede ser nulo, por lo que el puente tiene una forma de no representar ningún valor.

Si elimino el? from optInt está expuesto con un tipo de NSInteger, por lo que puedo ver que para enteros no opcionales evita objetos y puentea el tipo de valor al tipo de valor, ¿pero esto significa literalmente que un Int? no puede ser expuesto?

Parece que no puedo encontrar ninguna documentación que explícitamente dice que este es el caso. Hay una lista completa de características de Swift incompatibles aquí que no aparece: Usar Swift de Objective-C

El caso de uso aquí es la situación clásica que requiere el paso de una identificación numérica que legítimamente podría ser cero. En el mundo anterior a Swift NSNumber y nil es exactamente cómo me puse a implementar esto, pero me siento mal al tratar de migrar una clase a Swift pero luego aferrarme a los tipos Obj-C dentro de la clase Swift específicamente por este motivo.

Supongo que había previsto que un Int? a diferencia de Int, se puentearía como NSNumber en segundo plano, con su valor potencialmente nulo alimentando el elemento “no tiene valor” de la opción en Swift.

¿Hay algo que me falta aquí? Para reiterar, ¿puede un Swift Opcional Int (Int?) Exponerse a Objective-C a través de un puente?

El problema con exponer un Int? la propiedad como NSNumber* es que puede almacenar un NSNumber compatible con Int desde Objective-C.

Usted puede hacer un NSNumber? calculado NSNumber? propiedad para envolver su Int? propiedad. ¿El getter simplemente devolvería el Int? variable. El colocador establecería la variable Int desde -[NSNumber integerValue] .

Aquí hay una respuesta concreta para la solución descrita anteriormente:

 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 }