Какие ограничения на типы данных существуют для массива (Array) в Swift?

«Какие ограничения на типы данных существуют для массива (Array) в Swift?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Основное ограничение: Swift-массивы являются гомогенными коллекциями. Все элементы одного массива должны быть одного и того же типа. Это фундаментальный принцип системы типов Swift, обеспечивающий безопасность и предсказуемость.

Как работать с разными типами?

  1. Использование протоколов (наиболее предпочтительно):
    protocol Drawable { func draw() }
    struct Circle: Drawable { func draw() { print("○") } }
    struct Square: Drawable { func draw() { print("□") } }
    let shapes: [Drawable] = [Circle(), Square()] // OK
  2. Использование дженериков:
    func process<T>(_ items: [T]) { /* T — один конкретный тип для всего массива */ }
    process([1, 2, 3]) // T == Int
    process(["a", "b"]) // T == String
  3. Тип Any (использовать с осторожностью):
    let mixedArray: [Any] = [42, "Hello", 3.14]
    // При извлечении требуется явное приведение типа (as?, as!), что снижает безопасность.

Почему это важно?

  • Безопасность: Компилятор проверяет типы, предотвращая ошибки времени выполнения.
  • Производительность: Знание конкретного типа позволяет оптимизировать доступ к памяти.
  • Читаемость: Код становится более понятным и предсказуемым.

Ключевое отличие от Set: В отличие от Set, для Array не требуется соответствие Hashable. Требуется лишь единый тип элементов.