Supponiamo (per ragioni di discussione) di avere una classe vista che contiene un NSDictionary. Voglio un sacco di proprietà, tutte che accedono ai membri di quel dizionario.Scrivere le proprie proprietà @dynamic in Cocoa
Ad esempio, voglio @property NSString* title
e @property NSString* author
.
Per ognuna di queste proprietà, l'implementazione è la stessa: per il getter, chiamare [dictionary objectForKey:propertyName];
e per il setter fare lo stesso con setObject: forKey :.
Ci vorrebbe un sacco di tempo e usare un sacco di codice copia-e-incolla per scrivere tutti quei metodi. C'è un modo per generarli tutti automaticamente, come Core Data fa con le proprietà @dynamic per le sottoclassi NSManagedObject? Per essere chiari, voglio solo questo mezzo di accesso per le proprietà che definisco nell'intestazione, non solo qualsiasi chiave arbitraria.
Ho trovato valueForUndefinedKey: come parte della codifica del valore chiave, che potrebbe gestire i getter, ma non sono del tutto sicuro se questo è il modo migliore per andare.
Ho bisogno che queste siano proprietà esplicite, quindi posso associarle a Interface Builder: alla fine ho intenzione di scrivere una tavolozza IB per questa vista.
(BTW, so che il mio esempio di utilizzo di un NSDictionary per archiviarli è un po 'forzato. In realtà sto scrivendo una sottoclasse di WebView e le proprietà faranno riferimento agli ID degli elementi HTML, ma ciò non è importante per logica della mia domanda!)
Solo il tweak che farei è solo la minuscola della prima lettera (e assicurarsi che la stringa _cmd abbia almeno 5 caratteri): NSString * property = NSStringFromSelector (_cmd); NSString * firstLetter = [[proprietà substringWithRange: NSMakeRange (3, 1)] lowercaseString]; proprietà = [firstLetter stringByAppendingString: [proprietà substringWithRange: NSMakeRange (4, [proprietà length] - 5)]]; – charles
Ottimo esempio. Ero arrivato a una specie di IMP (per esempio: setName: "il mio IMP era' setValueForName') ma il tuo uso di 'NSStringFromSelector (_cmd)' mi dava esattamente il calcio nei pantaloni mentali che stavo cercando generalizza a 'setWhatever:'. Grazie per averlo scritto. – matt