过滤元素

时间:2017-06-13 10:42:00

标签: ios swift

我在过滤我的元素数组时遇到了问题,让我们说。

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个过滤器。

我还希望显示与用户选择相匹配的框,即使他们只为选定的僵尸选择了一些过滤器。

1 个答案:

答案 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
}