Swift如何实现Chest类接收Inventory数组完成游戏物品箱存取功能
代码调整方案
原代码存在的问题
Inventory类设计不合理:当前把每个道具类型写死成单独的字符串属性,没法灵活存储任意数量的多类道具,不符合「存储道具列表」的需求Chest类缺少初始化方法,也没有实现要求的元素添加、移除方法- 子类
Inv2逻辑错误:inventory是Chest的属性,不能直接在Inventory子类里调用,且append逻辑和需求不符
调整后实现代码
// 道具类型枚举,方便分类管理各类道具 enum ItemType { case weapon, herb, questItem, clothing } // 道具结构体,存储单个道具的基础信息 struct Item { let name: String let type: ItemType } // 基类Inventory:负责存储自身的道具列表 class Inventory { // 存储当前Inventory内的所有道具 var items: [Item] = [] // 基类提供基础的道具增删方法,子类可按需重写 func addItem(_ item: Item) { items.append(item) } func removeItem(named name: String) -> Item? { guard let index = items.firstIndex(where: { $0.name == name }) else { return nil } return items.remove(at: index) } } // Chest类:存储多个Inventory实例的数组 class Chest { var inventories: [Inventory] = [] // 要求实现的Inventory元素添加方法 func addInventory(_ inventory: Inventory) { inventories.append(inventory) } // 要求实现的Inventory元素移除方法 func removeInventory(at index: Int) -> Inventory? { guard index >= 0 && index < inventories.count else { return nil } return inventories.remove(at: index) } } // Inventory子类:实现操作Chest的功能 class OperableInventory: Inventory { // 持有需要操作的Chest实例引用 weak var targetChest: Chest? // 向关联的Chest添加当前自身这个Inventory实例 func addSelfToChest() { guard let chest = targetChest else { return } chest.addInventory(self) } // 从关联的Chest中移除自身 func removeSelfFromChest() { guard let chest = targetChest, let index = chest.inventories.firstIndex(where: { $0 === self }) else { return } chest.removeInventory(at: index) } // 也可重写基类的道具操作方法,增加自定义逻辑 override func addItem(_ item: Item) { print("成功添加道具:\(item.name)") super.addItem(item) } } // 示例用法 // 1. 创建宝箱实例 let commonChest = Chest() // 2. 创建子类Inventory实例,绑定目标宝箱 let herbInventory = OperableInventory() herbInventory.targetChest = commonChest // 3. 往Inventory里添加草药道具 let mint = Item(name: "薄荷", type: .herb) herbInventory.addItem(mint) // 4. 通过子类方法把这个Inventory存入宝箱 herbInventory.addSelfToChest() // 查看宝箱内的Inventory数量:print(commonChest.inventories.count) 输出1
实现逻辑说明
- 先定义
Item结构体和ItemType枚举,统一描述各类道具,灵活支持武器、草药、任务物品、服装等多种类型的扩展 Inventory基类负责管理自身的道具列表,提供基础的道具增删接口Chest类内部维护[Inventory]类型的数组,同时实现了要求的Inventory实例添加、移除方法OperableInventory子类继承Inventory,通过持有Chest的引用,实现了把自身添加到Chest、从Chest中移除的功能,完全符合需求
内容的提问来源于stack exchange,提问作者Kseniia Piskun
相关产品推荐
相关产品推荐

