Можно ли в Swift Dictionary хранить значения разных типов данных?

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

Ответ

Да, но это нарушает типобезопасность (type safety) языка. Есть два основных подхода:

1. Использование типа Any (НЕ РЕКОМЕНДУЕТСЯ для моделей данных):

var mixedDict: [String: Any] = [
    "name": "Alice",     // String
    "age": 30,           // Int
    "isStudent": false   // Bool
]
// При извлечении требуется явное приведение типа (casting).
if let name = mixedDict["name"] as? String {
    print(name)
}
// Риски: ошибки времени выполнения (runtime errors) при неверном приведении.

2. Использование Enum с ассоциированными значениями (ПРАВИЛЬНЫЙ ПОДХОД):

enum TypedValue {
    case string(String)
    case int(Int)
    case bool(Bool)
    case double(Double)
}

var safeDict: [String: TypedValue] = [
    "name": .string("Alice"),
    "age": .int(30),
    "isStudent": .bool(false)
]

// Извлечение с помощью switch гарантирует обработку всех типов.
switch safeDict["age"] {
case .int(let age):
    print("Age is: (age)")
case .string, .bool, .double, nil:
    break
}

Почему enum лучше? Компилятор проверяет полноту обработки всех возможных типов, исключая ошибки времени выполнения и делая код самодокументируемым.