gpt4 book ai didi

swift - 我应该对存储在 Swift 数组中的元素使用类还是结构

转载 作者:可可西里 更新时间:2023-11-01 00:55:43 26 4
gpt4 key购买 nike

我想改变存储在数组中的 Swift 结构中的属性。我跳了一段重新分配的舞蹈,但感觉不对。

我被鼓励尽可能使用 Struct,但是这个相对简单的用例(如下)促使我使用类(引用类型)。

我应该为 Game 和/或 Player 使用 Classes 吗?

请在下方找到代码示例 .. 以及随附的单元测试

测试总结
• 创建游戏
• 创建两个玩家
• 将两个玩家都添加到游戏中
• 向游戏发送消息到 decrementPlayer
• 游戏遍历集合(玩家)
• 查找玩家并发送消息 decrementScore
测试失败 - 玩家的分数达到预期(分别为 60 和 70)

struct Game {
fileprivate(set) var players = [Player]()
}

extension Game {
mutating func addPlayer(_ player: Player) {
players.append(player)
}

mutating func decrementPlayer(_ decrementPlayer: Player, byScore: Int) {
for var player in players {
if player == decrementPlayer {
player.decrementScore(by: byScore)
}
}
}
}


struct Player {
var name: String
var score: Int

init(name: String, score: Int) {
self.name = name
self.score = score
}

mutating func decrementScore(by byScore: Int) {
self.score -= byScore
}
}

extension Player: Equatable {
public static func ==(lhs: Player, rhs: Player) -> Bool {
return lhs.name == rhs.name
}
}

class GameTests: XCTestCase {

var sut: Game!

func testDecrementingPlayerScores_isReflectedCorrectlyInGamePlayers() {
sut = Game()
let player1 = Player(name: "Ross", score: 100)
let player2 = Player(name: "Mary", score: 100)

sut.addPlayer(player1)
sut.addPlayer(player2)
XCTAssertEqual(2, sut.players.count) // Passes

sut.decrementPlayer(player1, byScore: 40)
sut.decrementPlayer(player2, byScore: 30)
XCTAssertEqual(60, sut.players[0].score) // Fails - score is 100 .. expecting 60
XCTAssertEqual(70, sut.players[1].score) // Fails - score is 100 .. expecting 70
}
}

最佳答案

I'm encouraged to use Struct's where possible

是的,这是有问题的。应该鼓励您在适当的地方使用struct。一般来说,我发现 struct 并不总是像时尚要求的那样合适。

这里的问题是 for var player ... 语句在迭代和修改副本时实际上生成了每个玩家的可变副本。如果您想坚持使用 struct,您可能需要采用更实用的方法。

mutating func decrementPlayer(_ decrementPlayer: Player, byScore: Int) {
players = players.map {
return $0 == decrementPlayer ? $0.scoreDecrementedBy(by: byScore) : $0
}
}

或者更传统(并且几乎肯定更有效)的方法是找到您想要的播放器的索引

mutating func decrementPlayer(_ decrementPlayer: Player, byScore: Int) {
if let index = players.index(of: decrementPlayer)
{
players[index].decrementScore(by: byScore)
}
}

关于swift - 我应该对存储在 Swift 数组中的元素使用类还是结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48750082/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com