首页 > 解决方案 > 将对象数组转换为累积字典 Swift

问题描述

我有一个叫做的结构person

struct person{
   var name : String
   var score: Int
}

然后我创建一个名为 let people : [person] = [person("a", 1), person("a", 3), person("b", 5)]

如您所见,这里有两个同名“a”的对象。

现在我想把这个变成一个累积字典,显示每个人的总分。在这种情况下 dict = {"a": 4 (3+1), "b": 5}

我知道我违反了 OO 设计规则。谢谢

标签: arraysswiftdictionary

解决方案


这里有一个基本的建模问题。您的结构person实际上并没有为人建模。它模拟类似RoundResult.

我将通过制作一个Player真正模拟一个人的 a 来重构它(只有类似 的字段name: String),并制作一个RoundResult包含 awinner: Player和 a 的 a score: Score

struct Player: Hashable { // Perhaps should be a class, if names aren't unique.
    let name: String
}

struct RoundResult {
    let winner: Player
    let score: Int
}

let playerA = Player(name: "a")
let playerB = Player(name: "b")

let roundResults = [
    RoundResult(winner: playerA, score: 1),
    RoundResult(winner: playerA, score: 3),
    RoundResult(winner: playerB, score: 5),
]

let scoresByPlayer = Dictionary(grouping: roundResults, by: \.winner)
    .mapValues { roundResults -> Int in
        let scores = roundResults.lazy.map(\.score)
        return scores.reduce(0, +)
    }

print(scoresByPlayer)

从这里,您可以score在球员上添加一个变量,该变量实际上模拟球员得分,而不仅仅是单轮/比赛/比赛/任何事情中的一小部分


推荐阅读