Ответ
Да, но это нарушает типобезопасность (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 лучше? Компилятор проверяет полноту обработки всех возможных типов, исключая ошибки времени выполнения и делая код самодокументируемым.