2016-03-03 12 views
7

Il mio team ha deciso che i nuovi file dovrebbero essere scritti in modo rapido, e sto vedendo uno strano problema nell'usare KVC in un oggetto Objective-C per impostare una proprietà su un oggetto Swift.Perché non posso utilizzare KVC da un oggetto Objective-C a una proprietà Swift?

mio Objective-C imposta una proprietà in questo modo: [textObject setValue:0.0 forKey:@"fontSize"]

Il mio scopo Swift (textObject) ha un personalizzato setter/getter per questa proprietà.

var fontSize: CGFloat? { 
     get { 
     return internalTextGraphic?.fontSize 
     } 
     set { 
      internalTextGraphic?.fontSize = newValue 
     } 
    } 

Tuttavia, se ho impostato un punto di interruzione nel set, non è mai viene colpita.

Ho oggetti Objective-C che ottengono anche questa stessa chiamata, e ho appena implementato -setFontSize, e l'esecuzione entra correttamente.

Perché non riesco a entrare nel mio metodo set tramite -setValueForKey? Ho confermato al 100% che lo textObject esiste ed è del tipo corretto.

EDIT:
Martin R è corretto, ho dovuto fare il tipo di un non-optional. Questo è il mio codice di lavoro:

var fontSize: CGFloat { 
     get { 
     var retFontSize: CGFloat = 0.0 
     if let fontSize = internalTextGraphic?.fontSize { 
      retFontSize = fontSize 
     } 
     return retFontSize 
     } 
     set { 
     if let textGraphic = internalTextGraphic { 
      textGraphic.fontSize = newValue 
     } 
     } 
    } 

risposta

8

Il motivo è che un Swift opzionale struct o enum (nel tuo caso CGFloat?) non è rappresentabile in Objective-C (e non si vedrà che la proprietà nel generato File di intestazione "Project-Swift.h"). Che diventa più evidente se si contrassegna la proprietà esplicitamente @objc, allora si otterrà il messaggio di errore

 
error: property cannot be marked @objc because its type cannot be represented in Objective-C 

Se si cambia il tipo di struttura al non-optional CGFloat poi KVC funziona come previsto. Funzionerebbe anche con un tipo di classe opzionale, ad esempio NSNumber?.

+1

* "un Swift opzionale non è rappresentabile in Objective-C" * - beh, questo non è vero per classi opzionali/tipi di protocollo, ma è vero per struct/enums, di cui CGFloat è uno. – jtbandes

+0

@jtbandes: hai ragione, risolto - grazie! –

Problemi correlati