Hola, les saluda Luis y aquí les traigo un post.
Índice
Pueden parecer iguales pero tienen algunas diferencias importantes
A primera vista, una matriz y un conjunto parecen ser casi lo mismo. Ambos son tipos de colección y tienen muchas similitudes.
Aún así, a menudo nos sentimos tentados a usar matrices en lugar de conjuntos. Si bien esto no es necesariamente un problema, definitivamente es mejor a veces optar por un juego.
Las diferencias fundamentales
Antes de sumergirnos en las razones reales para elegir una matriz o conjunto, repasemos algunas diferencias fundamentales en el trabajo entre los dos tipos.
Cuando comparamos la inicialización de matrices y conjuntos, podemos ver que son bastante similares:
let arrayOfBlogCategories: [String] = ["Swift", "Debugging", "Xcode", "Workflow", "Optimization"] let setOfBlogCategories: Set<String> = ["Swift", "Debugging", "Xcode", "Workflow", "Optimization"]
Ambos tipos admiten lo mismo ExpressibleByArrayLiteral
protocolo, aunque es bueno saber que el type Array
Literal
por defecto es una matriz. El uso del siguiente código terminará en una matriz de cadenas:
let blogCategories = ["Swift", "Debugging", "Xcode", "Workflow", "Optimization"] // Defaults to Array<String>
A primera vista, podría pensar que ambas colecciones son exactamente iguales después de la inicialización. Sin embargo, éste no es el caso. Eche un vistazo a la siguiente cita de la documentación:
Un conjunto almacena valores distintos del mismo tipo en una colección sin un orden definido. Puede utilizar un conjunto en lugar de una matriz cuando el orden de los elementos no sea importante o cuando necesite asegurarse de que un elemento solo aparezca una vez.
En otras palabras, un conjunto está desordenado pero una matriz está ordenada. La impresión de las colecciones después de la inicialización confirma esto:
print(arrayOfBlogCategories) // ["Swift", "Debugging", "Xcode", "Workflow", "Optimization", "WWDC"] print(setOfBlogCategories) // ["Xcode", "WWDC", "Swift", "Workflow", "Debugging", "Optimization"]
Es importante tener esto en cuenta al elegir su elección.
Tanto las matrices como los conjuntos son tipos de valor. Por lo tanto, si las define como constantes usando let
se encontrará con el siguiente error cuando intente agregar un objeto:
Como puede ver, tenemos nuestra primera diferencia. Tenemos que usar append(_:)
para una matriz y insert(_:)
para un juego.
Ambos métodos agregan la categoría WWDC
a la colección, pero solo en la matriz sabemos con certeza que se ha agregado al final de la lista, ya que la matriz está ordenada.
Otra diferencia aquí es el tipo de devolución del método insert(_:)
. Devuelve tanto un booleano inserted
y una propiedad memberAfterInsert
que contiene el objeto ya existente o el objeto recién insertado.
Esto puede ser valioso si desea proporcionar comentarios al usuario si un objeto ya existe:
let (inserted, memberAfterInsert) = setOfBlogCategories.insert("Swift") if !inserted print("(memberAfterInsert) already exists") // Prints: "Swift already exists"
Una gran diferencia entre conjuntos y matrices es la singularidad de los elementos. Una matriz puede contener el mismo valor dos veces, mientras que un conjunto nunca contendrá duplicados.
Esta es también la razón por la que lo anterior insert(_:)
El método devuelve un booleano para indicar si la inserción realmente se realizó correctamente.
Esta es una diferencia importante y puede ser la razón para elegir un Conjunto y evitar usar un filtro en una matriz para filtrar los duplicados.
Una de las mayores diferencias entre una matriz y un conjunto es el orden de los elementos. La documentación describe esto:
- Array: «Una colección ordenada de acceso aleatorio».
- Set: «Una colección desordenada de elementos únicos».
Por lo tanto, si el orden de los elementos es importante, opte por una matriz.
¿Qué pasa con NSOrderedSet?
Otro tipo disponible es NSOrderedSet
. Sin embargo, este no es un tipo Swift
y tiene un costo. Como es un tipo no genérico, tenemos que trabajar con objetos Any
y lanzarlos en todos los lugares donde lo usemos.
Pero es una excelente alternativa ordenada a las matrices y debe usarse cuando el rendimiento de las pruebas de pertenencia a un elemento es importante. Probar si un objeto está contenido en un conjunto es más rápido que probar la pertenencia a una matriz.
Diferencias de rendimiento
Otra razón para elegir un conjunto es cuando el rendimiento es importante o cuando se espera una gran cantidad de datos. Los elementos de un conjunto deben ajustarse al protocolo Hashable
que hace que un conjunto esté optimizado para el rendimiento.
Se necesita la misma cantidad de tiempo para buscar un elemento en una colección pequeña que en una colección grande.
Es una buena práctica, en general, crear colecciones inmutables si es posible para el rendimiento. Esto se aplica tanto a las matrices como a los conjuntos y permite que el compilador Swift optimice el rendimiento de las colecciones que crea.
Datos básicos, NSSet y conversión a tipos Swift
Es tentador optar por un conjunto escrito cuando se trabaja con colecciones en Core Data
. Sin embargo, esto tiene un costo que no siempre es evidente de inmediato.
Si su recopilación de datos básicos es una constante y no cambia (a menudo), está más que bien hacer un puente a un conjunto, ya que el método copy(with:)
, que se usa al hacer el puente, devuelve el mismo conjunto en un tiempo constante.
El rendimiento de copia de tipos NSSet mutables
no está especificado y debería. Puede leer más sobre este tema en la documentación.
Elija una matriz si:
- El orden es importante
- Deben ser posibles elementos duplicados
- El rendimiento no es importante
Elige un set si:
- El orden no es importante
- Los elementos únicos son un requisito
- El rendimiento es importante
Espero que hayas disfrutado este post.
Añadir comentario