我有一个可以描述为的关系: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/