Я хотел бы изменить свойство в структуре Swift, хранящейся в массиве. Я исполнил танец переназначения, но это не кажется правильным.
Мне рекомендуется использовать Struct, где это возможно, однако этот относительно простой вариант использования (ниже) подталкивает меня к использованию классов (ссылочных типов).
Должен ли я использовать Classes
для Game
и/или Player
?
Ниже приведен пример кода... с сопровождающим UnitTest
Сводка теста
• Создать игру
• Создать двух игроков
• Добавить обоих игроков в игру
• Отправить сообщение в игру для уменьшения размера игрока
• Игра повторяет сбор данных (players
)
• Находит игрока и отправляет сообщение 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
}
}