He usado NSSets muchas veces en mis aplicaciones, pero nunca he creado uno.
¿Cuándo es mejor utilizar an NSSeten lugar de an NSArrayy por qué?
                    
                        ios
                                objective-c
                                arrays
                                cocoa
                                cocoa-touch
                                
                    
                    
                        geminiCoder
fuente
                
                
            fuente

La imagen de la documentación de Apple lo describe muy bien:
Arrayes una secuencia ordenada (el orden se mantiene cuando agrega) de elementosSetes una lista de elementos distinta (sin duplicados) y desordenadafuente
La mejor respuesta es la propia documentación de Apple .
La principal diferencia es que
NSArrayes para una colección ordenada yNSSetes para una colección desordenada.Hay varios artículos que hablan sobre la diferencia de velocidad entre los dos, como este . Si está iterando a través de una colección desordenada,
NSSetes genial. Sin embargo, en muchos casos, necesitas hacer cosas que solo unoNSArraypuede hacer, por lo que sacrificas la velocidad por esas habilidades.NSSet
NSArray
¡Eso es todo lo que hay que hacer! Avísame si eso ayuda.
fuente
NSSetpor indexar. Es común utilizar dos estructuras de datos diferentes para los mismos datos. O construye e indexa en esa matriz :) Pero entonces es mejor usar una base de datos que ya lo tenga implementado.NSSetyNSArray, mi respuesta es precisa y completa. Sí, puede construir otras estructuras de datos, pero solo estoy comparando estos dos.NSArrayy alguna funcionalidad deNSSet, la respuesta correcta no es "utilizarNSArrayy sacrificar el rendimiento". La respuesta es combinar ambos o utilizar una estructura de datos diferente.NSOrderedSet está disponible en iOS 5+, por lo que la principal diferencia es si desea objetos duplicados en la estructura de datos.
fuente
NSArray :
NSSet :
fuente
Una matriz se utiliza para acceder a elementos por su índice. Cualquier elemento se puede insertar en la matriz varias veces. Las matrices mantienen el orden de sus elementos.
Un conjunto se usa básicamente solo para verificar si el artículo está en la colección o no. Los artículos no tienen concepto de orden ni indexación. No puede tener un artículo en un conjunto dos veces.
Si una matriz quiere verificar si contiene un elemento, tiene que verificar todos sus elementos. Los conjuntos están diseñados para utilizar algoritmos más rápidos.
Puedes imaginar un conjunto como un diccionario sin valores.
Tenga en cuenta que la matriz y el conjunto no son las únicas estructuras de datos. Hay otros, por ejemplo, Cola, Pila, Montón, Montón de Fibonacci. Recomendaría leer un libro sobre algoritmos y estructuras de datos.
Consulte wikipedia para obtener más información.
fuente
containsoperación esO(n). El número de comparaciones cuando no está en la matriz esn. El número medio de comparaciones cuando el objeto está en la matriz esn/2. Incluso si se encuentra el objeto, el rendimiento es terrible.NSArrays tienen otras ventajas de velocidad sobreNSSets. Como siempre, es una compensación.la matriz
el conjunto
fuente
Las principales diferencias ya se han dado en otras respuestas.
Solo me gustaría señalar que debido a la forma en que se implementan los conjuntos y diccionarios (es decir, usando hashes), uno debe tener cuidado de no usar objetos mutables para las claves.
Si una clave está mutada, el hash (probablemente) también cambiará, apuntando a un índice / depósito diferente en la tabla hash. El valor original no se eliminará y, de hecho, se tendrá en cuenta al enumerar o preguntar a la estructura su tamaño / recuento.
Esto puede provocar algunos errores realmente difíciles de localizar.
fuente
Aquí puede encontrar una comparación bastante completa de las estructuras de datos
NSArrayyNSSet.Breves conclusiones:
fuente
Por lo general, usaría un Conjunto cuando la velocidad de acceso es esencial y el orden no importa , o está determinado por otros medios (a través de un predicado o descriptor de clasificación). Core Data, por ejemplo, usa conjuntos cuando se accede a los objetos administrados a través de una relación a muchos
fuente
Solo para agregar un poco, uso el conjunto a veces solo para eliminar duplicados de la matriz como: -
fuente