Un object Swift Opzionale (Int?) Può essere esposto a Objective-C tramite il bridging?

All’interno di una class Swift derivata da un framework basato su Obj-C (ma potrebbe essere altrettanto facilmente una class Swift con un attributo @objc) dichiaro due proprietà memorizzate:

var optInt: Int? var optString: String? 

Solo optString viene esposto a Obj-C tramite l’intestazione -Swift.h generata.

Stringa? presumibilmente va bene perché è esposto usando un object NSString che può essere nullo, quindi il bridging ha un modo per non rappresentare alcun valore.

Se rimuovo il? da optInt è esposto con un tipo NSInteger, quindi posso vedere che per interi non facoltativi evita oggetti e ponti valore tipo di valore a tipo, ma questo significa letteralmente che un Int? non può essere esposto?

Non riesco a trovare alcuna documentazione che dice esplicitamente che questo è il caso. C’è un’intera lista di funzioni Swift incompatibili qui che questo non appare su: Uso di Swift da Objective-C

Il caso d’uso qui è la classica situazione che richiede il passaggio di un ID numerico che potrebbe legittimamente essere zero. Nel mondo pre-Swift NSNumber e nil è esattamente come sono andato a implementare questo, ma è semplicemente sbagliato cercare di migrare una class in Swift ma poi aggrapparsi a tipi Obj-C all’interno della class Swift appositamente per questo motivo.

Suppongo di aver immaginato che un Int? a differenza di Int sarebbe il bridge come NSNumber in background, con il suo valore potenzialmente nullo che alimenta l’elemento “has no value” dell’optional in Swift.

C’è qualcosa che mi manca qui? Per reiterare, un object Swift Opzionale (Int?) Può essere esposto a Objective-C tramite il bridging?

Il problema con l’esposizione di un Int? proprietà come NSNumber* è che è ansible memorizzare un NSNumber non- Int -compatibile da Objective-C.

È ansible creare un NSNumber? calcolato NSNumber? proprietà per avvolgere il tuo Int? proprietà. Il getter restituirebbe semplicemente l’ Int? variabile. Il setter imposterà la variabile Int da -[NSNumber integerValue] .

Ecco una risposta concreta per la soluzione sopra descritta:

 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 }