2015-03-31 9 views
7

Sto imparando Swift.Come utilizzare le associazioni di cacao contro le strutture di Swift

Io per lo più lavorano in iOS in questi giorni, ma sto attualmente lavorando su un piccolo progetto per OS X.

su OSX Mi piace usare attacchi di cacao per collegare i valori dal mio modello a elementi dell'interfaccia utente. Si risparmia scrivere tonnellate di codice di colla.

Sto scrivendo un programma che mette a confronto le prestazioni di Swift con quelle di C/Objective-C. Sto usando un generatore di numeri primi come progetto di test.

Ho creato una Swift Struct ComputeSettings che incapsula le impostazioni (e i risultati) per l'esecuzione del generatore di numeri primi sia in Swift che in Objective-C. La struct è simile al seguente:

struct ComputeResults 
{ 
    var totalCalculated: Int = 0 
    var primesPerSecond: Int = 0 
    var totalTime:  NSTimeInterval = 0 
} 
struct ComputeSettings 
{ 
    var totalToCalculate: Int = 10000000 
    var swiftResults:  ComputeResults = ComputeResults() 
    var objCResults:  ComputeResults = ComputeResults() 
} 

Ho poi ho una variabile di tipo ComputeSettings esempio a mio avviso regolatore:

class ViewController: NSViewController 
{ 
    var theComputeSettings = ComputeSettings() 
    var foo: Int = 12 
    //... 
} 

Nel mio UI, ho un campo di testo che permette l'input dell'utente il numero di numeri primi da calcolare. In IB, seleziono il campo, seleziono la scheda binding nell'area utility, quindi apro i binding dei valori. Mi lego alla mia classe ViewController. Inserisco un percorso chiave modello di self.theComputeSettings.totalToCalculate.

Quando eseguo il mio progetto non riesce con un'eccezione:

Impossibile impostare (contentViewController) definiti dall'utente proprietà ispezionato su (NSWindow): [addObserver: forKeyPath: @ opzioni "theComputeSettings.totalToCalculate" : 256 contesto: 0x0] è stato inviato a un oggetto che non è conforme a KVC per la proprietà "theComputeSettings".

Se, invece, mi legano alla proprietà manichino foo (in modo che il percorso della chiave del modello è impostato su self.foo) funziona perfettamente. In questo caso vedo il mio campo di testo visualizzare il mio valore di 12.

C'è un modo per usare le strutture di Swift e continuare a far funzionare le associazioni Cocoa? Ho fatto una buona dose di googling, ma non riesco a trovare nulla.

Posso certamente farlo in modo manuale e scrivere un po 'di codice colla per installare i miei valori dalla mia struttura nelle viste della mia finestra, ma preferirei utilizzare le associazioni Cocoa. Ecco a cosa servono.

risposta

9

Non è possibile utilizzare gli attacchi Cocoa con le strutture Swift.

Il sistema di rilegatura del cacao viene implementato oltre all'osservazione del valore-chiave e l'osservazione del valore-chiave viene implementata creando una sottoclasse per intercettare i messaggi set<Property>: inviati all'oggetto osservato. Le strutture di Swift non possono avere sottoclassi e non usano necessariamente messaggi o chiamate di funzione per impostare i campi struct, quindi in generale non c'è modo di intercettare l'impostazione di un campo struct Swift.

Il messaggio si lamenta della mancanza di conformità KVC poiché la codifica del valore chiave definisce la convenzione set<Property>: (e <property> getter) per i nomi dei messaggi.

+0

Pozzo. Questo sembra un serio limite.Sarebbe possibile implementare le categorie sui valori primitivi nelle strutture e/o sulle strutture stesse per mappare un metodo didSet rapido per chiamare un metodo set compatibile con KVO? Sono nel mezzo della scrittura di 500 libbre. di codice colla per leggere/visualizzare valori nei miei campi. Le associazioni di cacao sono una delle cose migliori dello sviluppo di OS X. Preferisco davvero usarli, anche se ciò significa fare un po 'di sollievo. –

+0

Perché ComputeResults deve essere una struttura? È in realtà parte del codice che stai profilando? –

+0

Non ** deve ** essere una struttura. Sembrava il modo più pulito per rappresentare i dati. Credo che lo cambierò in un oggetto dati personalizzato, poiché le proprietà sugli oggetti dovrebbero essere conformi a KVO, giusto? –

Problemi correlati