2017-06-13 66 views
0

我想過濾我的元素數組有問題,比方說。元素的過濾

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

你的意思是你有一些過濾器選項由用戶選擇如果用戶只選擇'殭屍'和'武器',那麼只需要過濾那兩個? –

+0

是的,這是正確的 – WYS

回答

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

謝謝,我不能相信我在這個o.O上用了這麼多時間。 – WYS

+1

@WYS歡迎隊友,很高興爲您服務:) –