我有一个可以描述为的关系:

Factory -< Engine

玩家仅引用自己拥有的engines

即:

Player: { name: "Bob", engines: [Engine]() }

我希望对工厂进行筛选,确定某个参与者是否负担得起工厂;但我也想过滤掉玩家已经拥有的所有引擎。

也就是说,


  玩家只能购买每个工厂一次。


..

我的过滤掉负担得起的工厂的代码是这样的:

  let results = factories.filter { (factory:Factory) -> Bool in
      return ((factory.cost <= Int(firstPlayer.cash)) && (factory.isUnlocked))
  }


我的代码用于过滤给定父工厂的玩家拥有的引擎

  let ownedEngines = player.engines.filter { (eng:Engine) -> Bool in
      return ((eng.owner == player) && (eng.parent == factory))
  }


但是我如何结合他们说呢?

给我列出我还没有拥有的,我负担得起的所有工厂的清单吗?

非常感谢



编辑:课程大纲如下

class Factory {
  var name: String
  var cost: Int
  var engines: [Engine] = [Engine]()
}

class Engine {
  var name: String
  weak var parent: Factory?
  weak var owner: Player?
  var units: Int
}

class Player {
  var name: String
  var cash: Int
  var engines: [Engine] = [Engine]()
}


进一步的信息

我能描述的最好方法是:

游戏代表了几个收集在[deck]中的工厂。
每个deck中都有多张卡片;这些是引擎。
每个玩家不能多次购买同一家工厂。

我需要参考子对象有多少units和其他元数据,因此这就是为什么有Engine实体的原因。

因此,当玩家购买工厂时,实际上是在购买引擎,而从未直接拥有工厂。可以从子对象中收集所有引用。

我需要过滤掉:


我负担得起的所有工厂的decks
我已经通过引擎卡拥有的所有工厂


所以我现在就这样

// static Function in my factory model
    public static func filterDecksForCash(decks: [Factory], cash:Int) -> [Factory] {
            let results = decks.filter { (f:Factory) -> Bool in
                return ((loco.cost <= Int(cash)) && (loco.isUnlocked))
            }
            return results
        }


let decks = Factory.createAll()


        // filter deck for cost, unlock but also all trains but also remove trains they've already purchased
        var results = Factory.filterDecksForCash(decks: decks, cash: firstPlayer.cash)

        for (index, factory) in results.enumerated() {
            for eng in factory.engines {
                if (eng.owner == firstPlayer) {
                    results.remove(at: index)
                }
            }
        }

最佳答案

我决定运行一个for循环,该循环会删除不需要的项目。

问题已结案。

我也在尝试与此类似的功能;

let filtered = decks.filter { (deck:EYLocomotive) -> Bool in
            return ((deck.isUnlocked) && (deck.orders.count > 0))
            }.map({ $0.engines.filter({ (eng:EYEngine) -> Bool in
                return (eng.owner != nil)
            })})

关于arrays - Swift-通过修剪给定父级的子级“拥有”项来过滤数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44178908/

10-11 22:57