Какие типы могут быть ключами и значениями в словаре Swift?

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

Ответ

В Swift тип словаря определяется как Dictionary<Key, Value> или [Key: Value].

Требования к ключам:

  • Ключ должен соответствовать протоколу Hashable.
  • Это гарантирует, что ключ можно однозначно идентифицировать и использовать для быстрого поиска.
  • Стандартные типы: String, Int, Double, Bool, Character, URL и т.д.
  • Пользовательские типы: Нужно реализовать Hashable (часто через автоматический синтез).
    struct UserID: Hashable { // Автоматический синтез работает
    let rawValue: Int
    }
    var scores: [UserID: Int] = [:]

Требования к значениям:

  • Ограничений нет. Значением может быть любой тип.
  • Могут повторяться для разных ключей.
  • Могут быть опционалами, массивами, другими словарями, функциями (closures) или экземплярами классов.
// Словарь с разными типами значений
var heterogeneousDict: [String: Any] = [
    "name": "Alice",          // String
    "age": 30,                // Int
    "scores": [95, 87, 92],   // Array<Int>
    "meta": [                 // Dictionary
        "timestamp": Date()
    ],
    "handler": { print("Done") } // Closure
]

// Словарь с опциональными значениями
var optionalDict: [String: String?] = [
    "optionalKey": nil
]

Рекомендация: Избегайте типа Any для значений. Используйте дженерики или enum с ассоциированными значениями для типобезопасности.