如何访问类中的对象?注册新玩家对象的访问与标识问题
嘿,我来帮你搞定这个问题!你遇到的核心问题其实是创建玩家对象后没有保留对它的引用,所以没法后续访问和修改它的属性。下面给你两种实用的解决方案,结合你的Players类来演示:
方案一:创建对象时直接赋值给标识符(变量)
当你调用Players的初始化方法创建新对象时,把它赋值给一个变量(也就是你说的“标识符”),之后就能通过这个变量直接访问和修改对象的属性了。先补全你的类定义,再给你写完整的示例:
class Players { var name: String var gold: Int var accountPassword: String init(name: String, gold: Int, accountPassword: String) { self.name = name self.gold = gold self.accountPassword = accountPassword } } func registerNewPlayer(name: String, password: String) -> Players { // 创建新玩家并赋值给变量newPlayer(这就是标识符) let newPlayer = Players(name: name, gold: 0, accountPassword: password) // 在这里就能直接修改属性 newPlayer.gold = 100 // 给新玩家发初始金币 return newPlayer // 返回对象,方便外部代码也能访问它 } // 使用注册函数 let myPlayer = registerNewPlayer(name: "Jared", password: "mySecurePass") // 后续随时修改属性 myPlayer.name = "JaredP" myPlayer.gold += 50 // 金币增加50
方案二:用集合管理多个玩家对象
如果你的游戏需要同时管理多个玩家,推荐用字典(用用户名/玩家ID作为键)或者数组来存储所有玩家对象,这样就能通过键或索引快速找到对应的玩家并修改属性:
// 可以在游戏管理器类里或者全局维护这个字典,用来存所有玩家 var allRegisteredPlayers: [String: Players] = [:] func registerNewPlayer(name: String, password: String) { let newPlayer = Players(name: name, gold: 0, accountPassword: password) // 用用户名作为唯一标识符存入字典 allRegisteredPlayers[name] = newPlayer } // 注册一个玩家 registerNewPlayer(name: "Jared", password: "mySecurePass") // 后续找到这个玩家并修改属性 if let jaredPlayer = allRegisteredPlayers["Jared"] { jaredPlayer.gold = 200 jaredPlayer.name = "JaredTheLegend" }
另外提醒一下:你已经把Players类的属性定义成var(可变)了,这是对的——如果用let定义的话,创建后就没法修改属性值了,这点你做得没问题。
内容的提问来源于stack exchange,提问作者Jared Pieniazek
相关产品推荐
相关产品推荐

