2017-05-25 47 views
0

我可以描述爲關係修剪孩子「擁有」過濾內容的數組:斯威夫特從給定父

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) 
       } 
      } 
     } 
+0

請添加您的類實現。 – JuicyFruit

+0

爲什麼這些類會導入?我所做的只是過濾數組。無論如何,我會添加基本的刪除不重要的信息。 – zardon

+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) 
      })})