You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 02:27:01