我的关系可以描述为:
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)
}
}
}
答案 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)
})})