Guardando la documentazione, non vedo grandi differenze. Sia "valore" che "oggetto" sono di tipo ID, quindi può essere qualsiasi oggetto. La chiave è una volta una stringa, e nell'altro caso un id. Uno di loro sembra mantenere l'oggetto e l'altro no. Cos'altro? Qual è il caso?Dov'è la differenza tra setObject: forKey: e setValue: forKey: in NSMutableDictionary?
risposta
setValue:forKey:
fa parte del protocollo NSKeyValueCoding, che tra le altre cose consente di accedere alle proprietà dell'oggetto da Like Builder. setValue:forKey:
è implementato in classi diverse da NSDictionary
.
setObject:forKey:
è NSMutableDictionary's
motivo di esistere. La sua firma sembra essere abbastanza simile a setValue: forKey :, ma è più generico (ad esempio, qualsiasi tipo di chiave). È in qualche modo una coincidenza che le firme siano così simili.
Ciò che aggiunge confusione è che l'implementazione di NSMutableDictionary di setValue:forKey:
equivale a setObject:forKey:
nella maggior parte dei casi. In altre classi, setValue:forKey:
modifica le variabili membro. In NSMutableDictionary
, cambia le voci del dizionario, a meno che non si precisi la chiave con un carattere '@' - nel qual caso modifica le variabili membro.
Così, in poche parole, utilizzare setObject:forKey:
quando si ha bisogno di lavorare con le chiavi del dizionario e valori, e setValue:forKey:
nei casi più rari in cui è necessario affrontare KVP.
EDIT: e oh, sembra che questo è stato chiesto e ha risposto prima: Difference between objectForKey and valueForKey?
questa domanda non è esattamente la stessa.si tratta dei metodi getter, mentre questa domanda riguarda i metodi setter – user102008
Cosa intendi con "In NSMutableDictionary, cambia le voci del dizionario, a meno che tu non prefissi la chiave con un carattere '@' - nel qual caso modifica le variabili membro ". Quali variabili membro? Potresti anche commentare http://stackoverflow.com/questions/5755917/? Grazie. –
solo per completezza, setObject: forKey solleverà (eccezione) se l'oggetto è nullo. SetValue: forKey si comporta allo stesso modo o rimuove l'oggetto esistente dal dizionario quando si imposta nil per la chiave? –
Un'altra differenza è che se si dà un valore nullo per setValue:forKey:
, rimuove la chiave dal dizionario se esiste, altrimenti non fa niente. Ma se dai un valore nullo a setObject:forKey:
, solleva un'eccezione.
Questo è super utile da sapere. Ho altrimenti scritto la mia categoria su NSMutableDictionary per realizzare esattamente questo !. Grazie – Arman
Un'altra differenza è con l'indice obbiettivo-c, puoi scrivere 'dic [chiave] = valore;' per supportare la rimozione della chiave se il valore è 'nil'. La sottoscrizione è generalmente un approccio migliore rispetto a "setValue: forKey:" per ottenere questo risultato. –
anObject — Il valore per chiave. L'oggetto riceve un messaggio di conservazione prima di essere aggiunto allo NSDictionary
. Questo valore non deve essere nulla.
aKey — La chiave per il valore. La chiave viene copiata (utilizzando copyWithZone:
; le chiavi devono essere conformi al protocollo NSCopying
). La chiave non deve essere nulla.
valore — Il valore per chiave.
chiave — La chiave per il valore. Si noti che quando si utilizza la codifica del valore chiave, la chiave deve essere una stringa (vedere "Nozioni fondamentali sulla codifica dei valori-chiave").
Grazie per aver dato il motivo per cui setObject: forKey: solleva un'eccezione. @ breakfreehg –
-setValue:forKey:
solo inviare -setObject:forKey:
al ricevitore, a meno che il valore è nil
, nel qual caso inviare -removeObjectForKey
.
Morto semplice.
Questo è esattamente come funziona. –
oh hai ragione, fratello. Mi dispiace per quello È documentato qui: https://developer.apple.com/reference/foundation/nsmutabledictionary/1416335-setvalue?language=objc – Eddie
possibile duplicato di [Objective-C: Qual è la differenza tra objectForKey e valueForKey?] (Http://stackoverflow.com/questions/1062183/objective-c-whats-the-difference-tra-objectforkey-and-valforforkey – Mark