Swift - 通过修剪给定父级

时间:2017-05-25 11:01:07

标签: arrays swift filter

我的关系可以描述为:

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都有多张卡片;这些是引擎。 每个玩家不能多次购买同一个工厂。

我需要引用子对象的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)
                }
            }
        }

1 个答案:

答案 0 :(得分:0)

我决定运行一个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)
            })})