Supongamos (por razones de argumento) que tengo una clase de vista que contiene un NSDictionary. Quiero un montón de propiedades, todas las cuales acceden a los miembros de ese diccionario.Escribo mis propias propiedades @dynamic en Cocoa
Por ejemplo, quiero @property NSString* title
y @property NSString* author
.
Para cada una de estas propiedades, la implementación es la misma: para el getter, llame al [dictionary objectForKey:propertyName];
, y para el setter haga lo mismo con setObject: forKey :.
Tomaría un montón de tiempo y usaría un montón de código de copiar y pegar para escribir todos esos métodos. ¿Hay alguna manera de generarlos automáticamente, como Core Data con las propiedades @dinámicas de las subclases NSManagedObject? Para ser claro, solo quiero este medio de acceso para las propiedades que defino en el encabezado, no solo cualquier clave arbitraria.
Me he encontrado con valueForUndefinedKey: como parte de la codificación de valores clave, que podría manejar los captadores, pero no estoy del todo seguro de si este es el mejor camino a seguir.
Necesito que estas sean propiedades explícitas, así que puedo unirlas en Interface Builder: eventualmente planeo escribir una paleta IB para esta vista.
(Por cierto, sé que mi ejemplo de utilizar un NSDictionary para almacenar estos es un poco artificial. De hecho, estoy escribiendo una subclase de WebView y las propiedades se referirán a los ID de elementos HTML, pero eso no es importante para el ¡lógica de mi pregunta!)
El único cambio que haré es minúsculas en la primera letra (y asegúrese de que la cadena _cmd tenga al menos 5 caracteres): NSString * property = NSStringFromSelector (_cmd); NSString * firstLetter = [[propiedad substringWithRange: NSMakeRange (3, 1)] lowercaseString]; property = [firstLetter stringByAppendingString: [property substringWithRange: NSMakeRange (4, [property length] - 5)]]; – charles
Gran ejemplo. Había llegado a un tipo de IMP congelado (es decir, para 'setName:' mi IMP era 'setValueForName') pero su uso de' NSStringFromSelector (_cmd) 'me dio exactamente la patada en los pantalones mentales que estaba buscando. generalice esto a 'setWhatever:'. Gracias por escribirlo. – matt