我在过滤我的元素数组时遇到了问题,让我们说。
Box
-[Zombies]
-[Players]
-[Weapons]
我有一堆盒子,可以包含上面列出的所有数组。
[Box]
现在我想过滤掉那些我想要过滤掉的方框。 如果我选择一个特定的zombieId + playerId,我只能获得那些等等的方框。
我尝试使用类似的东西:
let filteredBoxes = boxes.filter { (box) -> Bool in
selectedZombies.contains(where: { $0.zombieId == box.zombies.zombieId })
&&
selectedPlayers.contains(where: { $0.playerId == box.players.playerId })
&&
selectedWeapons.contains(where: { $0.weaponId == box.weapons.weaponId })
}
这样可行,但要求用户在显示任何内容之前选择所有3个过滤器。
我还希望显示与用户选择相匹配的框,即使他们只为选定的僵尸选择了一些过滤器。
答案 0 :(得分:2)
如果要过滤特定条件,可以这样做,请声明类型为Bool
的3个实例属性,以控制当前允许的过滤器用户,并将其与filter
一起使用。
var filterZombie = true
var filterPlayer = true
var filterWeapon = false
//So now filterZombie and filterPlayer is true you want to filter only these two condition so make filter like this
let filterArray = boxes.filter { (box) -> Bool in
let zombieResult = filterZombie ? selectedZombies.contains(where: { $0.zombieId == box.zombies.zombieId }) : true //Set default result as true
let playerResult = filterPlayer ? selectedPlayers.contains(where: { $0.playerId == box.players.playerId }) : true //Set default result as true
let weaponResult = filterWeapon ? selectedWeapons.contains(where: { $0.weaponId == box.weapons.weaponId }) : true //Set default result as true
return zombieResult && playerResult && weaponResult
}