ОБНОВЛЕНИЕ Возможно, я ошибаюсь, что вы хотите получить.Ниже приведен еще один код, и, пожалуйста, проверьте результаты и выберите тот, который вы хотите.
Если вы хотите использовать reduce(into:updateAccumulatingResult:)
, вы можете написать что-то вроде этого.
do {
let response = try decoder.decode([UserModel].self, from: data)
let userArray: [(name: String, game: String)] = response.map {($0.name, $0.game)}
let reduction = userArray.reduce(into: [String:[String]]()) {result, element in
if !element.game.isEmpty {
result[element.name, default: []].append(element.game)
}
}
print(reduction)
} catch {
print(error)
}
Если вы предпочитаетеинициализатор Dictionary
, это может работать:
do {
let response = try decoder.decode([UserModel].self, from: data)
let userArray: [(name: String, games: [String])] = response.map {
($0.name, $0.game.isEmpty ? [] : [$0.game])
}
let reduction = Dictionary(userArray) {old, new in old + new}
print(reduction)
} catch {
print(error)
}
Оба вывода:
["@jade": ["WoW"], "@kalel": ["WoW"]]
В любом случае, ваш способ объединения циклов, Dictionary(grouping:)
и reduce(into:)
в дополнение к userDict.keys
делает вещи слишком сложными, чем они должны быть.
ADDITION Когда вы хотите получить словарь с ключами в качестве игр:
do {
let response = try decoder.decode([UserModel].self, from: data)
let userArray: [(game: String, name: String)] = response.compactMap {
$0.game.isEmpty ? nil : ($0.game, $0.name)
}
let reduction = userArray.reduce(into: [String:[String]]()) {result, element in
result[element.game, default: []].append(element.name)
}
print(reduction)
} catch {
print(error)
}
Или:
do {
let response = try decoder.decode([UserModel].self, from: data)
let userArray: [(game: String, names: [String])] = response.compactMap {
$0.game.isEmpty ? nil : ($0.game, [$0.name])
}
let reduction = Dictionary(userArray) {old, new in old + new}
print(reduction)
} catch {
print(error)
}
Вывод:
["WoW": ["@jade", "@kalel"]]