过滤境界与斯威夫特

问题描述:

对象

我总是试图使用NSPredicate筛选我的境界数据库时出现以下错误。这是我已经试过:过滤境界与斯威夫特

let realm = try! Realm() 
let predicate = NSPredicate(format: "typez.text.filter = 'special'") 
let filterThis = realm.objects(Publication).filter(predicate) 
print(filterThis) 

我的模型类的相关部分是:

class Publication: Object, Mappable { 
    dynamic var id: Int = 0 
    var typez = List<getType>() 
    dynamic var url: String? 
} 

class getType: Object, Mappable { 
    dynamic var text: String = "" 
} 
+0

什么是您的'发布'对象实现? –

+0

可以在这里找到:http://stackoverflow.com/questions/36835805/objectmapper-get-array-of-one-item-within-json – SoundShock

我不经常使用NSPredicate的直接,而不是我做的过滤器中内嵌谓词关闭参数中。

let realm = try! Realm() 
        //Array of publications    
    let realmObjects = realm.objects(Publication) 
    //any publication where .text property == special will be filtered. and filter out empty array 
    let filterThis = realmObjects.filter({ $0.getType.filter({ $0.text == "special" } != []) }) 
    print(filterThis) 
+0

我推荐这[文章](https://www.weheartswift.com/higher-order-functions-map-filter-reduce-and-more /)来学习更多有趣的技巧,包括如何在filter/map/reduce中使用'$ 0.property'闭包语法 – NSGangster

+0

给我出现以下错误:'不能用'((_) - > _')参数列表调用'filter'。当我将这个类设置为Equatable时,它表示这是一种冗余一致性。 – SoundShock

+0

如果'.text'属性是一个字符串,则不需要使用equateable,因为字符串是可以等化的。尝试铸造。我会更新我的答案。 – NSGangster

你提到的模型类的相关部分看起来像这样:

class Publication: Object, Mappable { 
    dynamic var id: Int = 0 
    var typez = List<getType>() 
    dynamic var url: String? 
} 

class getType: Object, Mappable { 
    dynamic var text: String = "" 
} 

如果我理解正确的话,你想找到Publication实例是在其typez清单,text条目等于special。你可以表达为:

let realm = try! Realm() 
let result = realm.objects(Publication).filter("ANY typez.text = 'special'") 
print(result) 
+0

尝试之前,但得到了错误'包含数组属性的关键路径必须使用聚合操作'# – SoundShock

+1

我的错误。你需要包含一个像ANY这样的修饰符来指定List中有多少个元素必须与包含的对象相匹配才能被视为匹配。我已经更新了答案。 – bdash

我不喜欢接受的答案在这里,因为它实际上并没有回答这个问题......但后来它比我意识到帮助了我。我现在将尽可能使用闭包而不是NSPredicates。这个问题的实际答案应该是@ NSGangster的答案的一个稍微修改版本:

let realm = try! Realm() 
    //Array of publications    
    let realmObjects = realm.objects(Publication) 
    //any publication where .text property == special will be filtered. and filter out empty array 
    let filterThis = realmObjects.filter({ $0.typez.filter({ $0.text == "special" } != []) }) 
    print(filterThis) 

..或者与之相近的东西。

但我所寻找的是有点不同。我需要一种方法来过滤多字字符串的确切单词,并且使用带有“CONTAINS”的NSPredicate将匹配任何包含的子字符串,例如,搜索“红色”会匹配“fred”。境界不支持“喜欢”或正则表达式还,所以使用封闭是我能得到工作的唯一的事:

//I was going for a "related terms" result for a dictionary app 
let theResults = terms.filter(
    { 
     //Looking for other terms in my collection that contained the 
     //title of the current term in their definition or more_info strings 
     $0.definition.components(separatedBy: " ").contains(term.title) || 
     $0.more_info.components(separatedBy: " ").contains(term.title) 
    } 
) 

尽可能多的一天,我花了搜索,希望这可以帮助别人带一个类似的问题。

+1

Realm自v2.1.2开始支持'LIKE'。另请注意,基于闭包进行过滤存在许多不利之处,如演示:性能和内存开销会变差,当Realm发生更改时,结果集合不会自动更新,而且您无法访问功能像通知。 – bdash