2010-03-22 4 views
20

Ho un'applicazione MVC. Il modello ha una proprietà che è una struct NSSize. E 'scrivibile come questo:Come fa NSValue a fare la sua magia?

- (void)setSize:(NSSize)aSize; 

La vista imposta questo NSSize utilizzando la chiave-valore-codifica. Tuttavia, non è possibile-valore-chiave del codice di una struct, quindi ho avvolto in un NSValue -oggetto come questo:

[theView setValue:[NSValue valueWithSize:mySize] 
      forKey:@"theModel.size"]; 

Per la mia comprensione, questo non dovrebbe funzionare in quanto la funzione di accesso si aspetta una struct e non un NSValue . Ma funziona perfettamente. Magicamente.

Com'è possibile?

+1

+1 questa è una grande domanda, perché la codifica dei valori-chiave è una delle cose veramente * fantastiche * sui framework Cocoa. Inoltre, +1 per il tag "magico"! –

risposta

12

scorrere fino a "Wrapping and Unwrapping Structs", ma qui è la sostanza:

setValue:forKey: determina il tipo di dati richiesto dalla funzione di accesso appropriato o variabile istanza per la chiave specificata. Se il tipo di dati non è un oggetto, il valore viene estratto dall'oggetto passato utilizzando il metodo appropriato -<type>Value.

Btw, grazie per avermi fatto questa domanda! Questa è una di quelle cose al cacao che ha sempre "appena funzionato" e non ho mai pensato che non fosse ovvio come sia stato realizzato.

+0

Prego. Francamente, mi ha sconvolto quando improvvisamente "ha funzionato". – bastibe