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