ProgramaciónDesarrollador iOS

Hable sobre el tipo de datos Set en Swift: sus características, interfaces, el tiempo de ejecución de las operaciones y posibles trampas al usarlo, diferencias con Array.

Supere entrevistas con el asistente de IA Hintsage

Respuesta

Set es una colección desordenada de elementos únicos, implementada como una tabla hash. La principal diferencia con Array es la ausencia de valores duplicados y la falta de orden. Las principales interfaces: métodos de inserción (insert), eliminación (remove), comprobación de existencia (contains).

Tiempo de ejecución:

  • Las operaciones insert, remove y contains funcionan en promedio en O(1).
  • Iterar sobre todos los elementos — O(n).

Ejemplo de uso:

var numbers: Set<Int> = [1, 2, 3] numbers.insert(4) // Set: 1, 2, 3, 4 numbers.insert(2) // Set no cambiará, 2 ya está presente numbers.remove(1) // Set: 2, 3, 4 print(numbers.contains(3)) // true

Utilice Set cuando la unicidad sea importante, pero el orden no. Compare con Array:

  • La eliminación y búsqueda de un elemento en Array se realiza en O(n).
  • En Array se permiten valores duplicados.

El conjunto admite: ∪, ∩, −, ⊆, ⊇ y otras operaciones de teoría de conjuntos.

Pregunta capciosa

Pregunta:

¿Compilará el siguiente código y por qué?

let set: Set = [[1, 2], [3, 4]]

Respuesta: No, no compilará. Set requiere que el tipo de los elementos implemente el protocolo Hashable. Un array (Array) no implementa Hashable, por lo que no se pueden crear conjuntos de arrays directamente. Por ejemplo, Set<Int> es correcto, mientras que Set<[Int]> no lo es.

Ejemplos de errores reales debido a la falta de conocimiento sobre el tema


Historia

En un servicio, los desarrolladores almacenaban identificadores únicos de objetos como [Int], en lugar de Set<Int>. Esto causó problemas: las comprobaciones de existencia y eliminación funcionaban lentamente (tiempo — O(n)), aparecían duplicados, y se dañaba la lógica del negocio.


Historia

Intento de poner en Set tipos no estándar (por ejemplo, se creaba Set<MyModel>), pero el tipo no implementaba Hashable. El código solo se compilaba después de agregar los protocolos correspondientes, pero al implementar errores en hash(into:) ocurrían colisiones y comportamiento impredecible en tiempo de ejecución.


Historia

El desarrollador esperaba que el orden de iteración de los elementos en Set coincidiera con el orden de inserción, y diseñaba la interfaz de usuario en el mismo orden. Como resultado, en cada ejecución, el orden era diferente, lo que conducía a una presentación inconsistente de los datos para el usuario final.