【问题标题】:Class receives an array in Swift类在 Swift 中接收一个数组
【发布时间】:2021-10-31 08:54:17
【问题描述】:

我有作业要模仿一个游戏,其中你有一个箱子和一些物品(武器、药草等)。

我需要创建 2 个类 - `Chest`(包含数组 `[Inventory]` 以及附加和删除函数)和 `Inventory`(包含对象列表),然后将 `Inventory` 作为大批。

稍后我需要为 `Inventory` 创建子类,通过这些子类我将在 `Chest` 中添加或删除对象。

我尝试编写一些代码,但即使对于像我这样的初学者来说,它看起来也完全错误。

我怎样才能做到这一点?

class Inventory {
    var plant = ""
    var weapon = ""
    var questObjects = ""
    var pants = ""
}
class Chest {
    var inventory: [Inventory]
}
class Inv2: Inventory {
    var plant2 = "oak"
    func append() {
       inventory.append(contentsOf: plant)
    }
}

【问题讨论】:

  • 嗯,所以 Inventory 可能需要包含数组而不是单个属性 - 例如 var plants = [String]() 而不是 var plant = ""
  • 我已将您的建议添加到我的代码中,但我仍然如何在 Inventory 子类中进行更改?
  • 所以每个物品栏都是一种武器或药草之类的东西,还是一组东西? Inventory 子类化的目的是什么?
  • 每个库存包含一组东西。目的是未知的,至少对我来说是这样,但在我的作业中是这样说的。我猜,主要目的是训练学生做不同类型的课程

标签: arrays swift class


【解决方案1】:

也许这就是你要找的。 Inventory 拥有很多 Items。每个都是Object,有一定数量。

您可以使用addItem(_:) 将新物品添加到库存中,并使用useItem(_:) 使用其中一种物品(数量减少1)。

Chest 有自己的库存,您可以访问。

Inv2 继承自 Inventory 的所有内容,但有自己的 addPlant() 便捷方法。

库存:

class Inventory {
    enum Object {
        case plant
        case weapon
        case questObjects
        case pants
    }

    struct Item {
        let object: Object
        var quantity: Int
    }

    private(set) var items: [Item]

    init(items: [Item]) {
        self.items = items
    }

    func addItem(_ item: Item) {
        items.append(item)
    }

    func useItem(_ object: Object) -> Bool {
        guard let index = items.firstIndex(where: { $0.object == object }) else {
            // No item could be removed
            return false
        }
        items[index].quantity -= 1

        if items[index].quantity == 0 {
            items.remove(at: index)
        }

        return true
    }
}

胸:

class Chest {
    let inventory: Inventory

    init(inventory: Inventory = Inventory(items: [])) {
        self.inventory = inventory
    }
}

库存 2:

class Inv2: Inventory {
    func addPlant() {
        addItem(Inventory.Item(object: .plant, quantity: 1))
    }
}

【讨论】:

  • 哇!是的,这就是答案!但是,请您解释一下这部分代码中发生了什么? guard let index = items.firstIndex(where: { $0.object == object }) else { // 没有项目可以被移除 return false } $0 就像一个占位符? .firstIndex 指的是什么?什么是守卫让?非常感谢!
  • @KseniiaPiskun 当然。 firstIndex(where:) 搜索第一个满足条件的项目,如果存在则返回索引,或者nil$0 是简写,而不是提供变量,如 ... where: { item in item.object == object }。请参阅here 了解更详细的 $0 含义。由于firstIndex 可能返回nil,如果没有物品符合条件(物品不在库存中),那么我们return false 表示没有使用任何物品。 [1/2]
  • Here 是如何使用guard let。 [2/2]
  • 谢谢!现在这一切似乎更容易理解了,图片开始变得清晰!再次感谢!
猜你喜欢
  • 2022-08-03
  • 1970-01-01
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-09
相关资源
最近更新 更多