Не удается преобразовать возвращаемое выражение типа ‘[(ключ: строка, значение: Int)]’ в возвращаемый тип ‘[Строка: Int]’

#swift #dictionary

#swift #словарь

Вопрос:

У меня есть пользовательская структура данных, которая выглядит следующим образом:

 struct Entitlements {
    var entitlements: [Entitlement]

    struct Entitlement {
        var type: String
        var entitlement: Int
    }
}
  

У меня есть инициализатор, который принимает словарь [Строка: Int] и сопоставляет его с [Право]:

 init(entitlements: [String: Int]) {
    self.entitlements = entitlements.map({ (entitlement) -> Entitlement in
        return Entitlement(type: entitlement.key, entitlement: entitlement.value)
    })
}
  

У меня также есть функция, которая сопоставляет [Право] с [Строкой: Int]. Я попытался написать это так:

 func simplify() -> [String: Int] {
    self.entitlements.map { (entitlement) -> (key: String, value: Int) in
        return (key: entitlement.type, value: entitlement.entitlement)
    }
}
  

Но я получаю ошибку, которая выглядит следующим образом:

«Не удается преобразовать возвращаемое выражение типа ‘[(ключ: строка, значение: Int)]’ в возвращаемый тип ‘[Строка: Int]»

Я пытался использовать flatmap для объединения словарей в один, но безуспешно:

 func simplify() -> [String: Int] {
    self.entitlements.flatMap { (entitlement) -> [String: Int] in
        return [entitlement.type, entitlement.entitlement]
}
}
  

Но я получаю сообщение об ошибке:

«Невозможно определить тип закрытия в текущем контексте»

Любая помощь с этим была бы очень признательна!

Ответ №1:

Вы можете использовать Dictionary(uniqueKeysWithValues:) и сопоставить массив прав с массивом кортежей, чтобы получить правильный формат ввода для инициализации.

 func simplify() -> [String: Int] {
   Dictionary(uniqueKeysWithValues: entitlements.map{ ($0.type, $0.entitlement) })
}
  

Если вам нужно обрабатывать повторяющиеся ключи, есть также вариант, который требует закрытия для обработки того, что делать. Вот пример, основанный на документе Apple, где всегда выбирается первый ключ

 func toDictionary() -> [String: Int] {
    Dictionary(entitlements.map { ($0.type, $0.entitlement) },
               uniquingKeysWith: { (first, _) in first })
}