2013-07-30 13 views
6

Mi chiedo quale sia la decisione dietro il metodo NSDictionary allKeys, per restituire un NSArray, anziché un NSSet, che avrebbe più senso, poiché non vi è alcuna garanzia sull'ordine dell'array restituito e inoltre, una chiave è unicaNSDictionary allKeys restituisce NSArray, anziché NSSet

+2

Obiezione; Speculazione! –

+0

Questo non è principalmente basato sull'opinione, e ci sono tonnellate di precedenti per domande simili. –

+1

Anche se esiste un precedente per una tale domanda, non stai chiedendo agli sviluppatori originali e tutte le risposte possono essere solo speculazioni. Per questo, questo è il codice NextStep che stai chiedendo. La risposta potrebbe essere "compatibilità API con un tempo molto precedente rispetto a quello che si sta considerando". –

risposta

1

Beh, come tutti sono indovinare ...

Come ha detto il PO, ogni chiave è unica. Per l'array o il set case il codice del dizionario deve raccogliere le chiavi - il costo di questo si applica a entrambi. Nel set caso ogni chiave deve essere aggiunta al set, il che implica un test (inutile a quanto risulta) dell'adesione, mentre nel caso dell'array non è richiesto alcun test di appartenenza - il costo dell'aggiunta a un array deve essere minore di aggiungendo a un set. Array vince.

+0

Il tuo dire un inserimento NSSet richiederebbe una ricerca duplicata O (n)? Se Apple fosse così preoccupata delle prestazioni di NSSet, perché la userebbero in molti casi, ma non in questo caso. –

+0

Uno sguardo al codice sorgente mi mostra che usano la tabella di hash O (1) per NSSet. La risoluzione duplicata non ha alcun impatto. –

+0

@JustinMeiners - Non ho menzionato con attenzione O() ;-) Ma stai dicendo che hai esaminato il sorgente o l'array e impostato e determinato il costo del controllo è * zero * e che sans-controlla il costo dell'aggiunta un oggetto in un array e in un set sono uguali? Ma a meno che non ci siano commenti nel codice, ognuno si sta semplicemente divertendo qui, si possono fare delle discussioni per entrambe le scelte - e potrebbe anche essere stato arbitrario. – CRD

1

E, a parte quello che ha detto Justin, se in realtà volevi un elenco di chiavi del dizionario dovresti ottenere l'NSSet e poi convertirlo in un NSArray. Se vuoi semplicemente testare l'esistenza della chiave, OTOH, puoi andare direttamente contro il dizionario e non hai bisogno del set.

Problemi correlati