#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 })
}