2010-03-22 12 views
20

Tengo una aplicación MVC. El modelo tiene una propiedad que es una estructura NSSize. Es escribible como esto:¿Cómo hace NSValue su magia?

- (void)setSize:(NSSize)aSize; 

La vista fija este NSSize utilizando la clave-valor codificante. Sin embargo, no se puede clave-valor de código de una estructura, por lo que lo envolvió en una NSValue -objeto de esta manera:

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

A mi entender, esto no debería funcionar desde el descriptor de acceso espera una estructura y no un NSValue . Pero funciona perfectamente. Por arte de magia.

¿Cómo es esto posible?

+1

+1 esta es una gran pregunta, porque la codificación de clave-valor es una de las cosas realmente * increíbles * sobre los frameworks de Cocoa. Además, ¡+1 para la etiqueta "mágica"! –

Respuesta

12

vaya a "Wrapping and Unwrapping Structs", pero aquí está el quid:

setValue:forKey: determina el tipo de datos requerido por el descriptor de acceso apropiado o variable de instancia para la clave especificada. Si el tipo de datos no es un objeto, entonces el valor se extrae del objeto pasado utilizando el método apropiado -<type>Value.

Btw, gracias por hacer esta pregunta! Esta es una de esas cosas de cacao que siempre "funcionó" y nunca consideré que no era obvio cómo se lograba.

+0

De nada. Francamente, me impresionó cuando esto "simplemente funcionó". – bastibe

Cuestiones relacionadas