ฉันต้องการเปลี่ยนคุณสมบัติในโครงสร้าง Swift ซึ่งจัดเก็บไว้ในอาร์เรย์ ฉันได้ทำการเต้นรำมอบหมายใหม่แล้ว แต่รู้สึกว่ามันไม่ถูกต้อง
ฉันได้รับการสนับสนุนให้ใช้ Struct's เมื่อเป็นไปได้ อย่างไรก็ตามกรณีการใช้งานที่ค่อนข้างง่าย (ด้านล่าง) กำลังผลักดันให้ฉันใช้คลาส (ประเภทอ้างอิง)
ฉันควรใช้ Classes
สำหรับ Game
และ/หรือ Player
โปรดดูตัวอย่างโค้ดด้านล่าง .. พร้อมด้วย UnitTest
สรุปการทดสอบ
• สร้างเกม
• สร้างผู้เล่นสองคน
• เพิ่มผู้เล่นทั้งสองคนในเกม
• ส่งข้อความถึงเกมเพื่อลดผู้เล่น
• เกมวนซ้ำผ่านคอลเลกชัน (players
)
• ค้นหาผู้เล่นและส่งข้อความคะแนนลดลง
• การทดสอบล้มเหลว - คะแนนของผู้เล่นไม่ตามที่คาดไว้ (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
}
}