2017-07-26 96 views
1
let selectedConsoles = ["Xbox", "Playstation 4"] 
let players = realm.objects(Person).filter("consoles IN %@", selectedConsoles) 

可以说是玩家的财产控制台是一个List<console>()RealmSwift ALL谓词

所以我想过滤其既有的Xbox和PlayStation 4,目前我能够通过或比较来过滤他们所有的球员,我的目标是实现AND比较,例如目前它只检查玩家控制台中是否存在“xbox”或“playstation 4”。我想要返回拥有两个游戏机的玩家。 任何帮助或提示将不胜感激

回答

2

为了让那些有两种类型的控制台,你需要“和”他们。你需要“或”他们在一起,如果想要那些有选择的,还有。如果你“和”他们你必须有两个或它不会被包括在内,如果你是“或者”他们,如果存在的话,它将被包括在内。

所以你需要创建一个复合“或”谓词。您为每个要包含的案例创建一个谓词,然后使用复合谓词将所有谓词“或”[或“和”]结合在一起。

我根据上面提供的内容做了一些猜测,但这应该非常接近。让我知道是否需要澄清或清理。它编译,但我没有为它创建一个测试数据集。用尖括号>内的<变量替换变量名称(用于领域对象)和类名称。

let selectedConsoles = ["Xbox", "Playstation 4"] 
    let predicateOne = NSPredicate(format:"consoles IN %@", [selectedConsoles[0]]) 
    let predicateTwo = NSPredicate(format:"consoles IN %@", [selectedConsoles[1]]) 
    let compoundPredicateEitherConsole = NSCompoundPredicate(orPredicateWithSubpredicates: [predicateOne, predicateTwo]) 
    let compoundPredicateBothConsoles = NSCompoundPredicate(andPredicateWithSubpredicates: [predicateOne, predicateTwo]) 
    let results = <realm>.objects(<YourClassName>.self).filter(compoundPredicateEitherConsole) 
+0

谢谢我只是做了几乎相同的事情,它没有工作,我发现NSCompoundPredicate有LogicalType .and。其余的很容易做出CompoundPredicate – ivan123

+0

非常好!很高兴你解决了它!很容易忘记NSCompoundPredicate可用。它在您需要时派上用场。 – Mozahler