2016-04-25 119 views
5
對象

我總是試圖使用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

回答

0

我不經常使用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

9

你提到的模型類的相關部分看起來像這樣:

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

1

我不喜歡接受的答案在這裏,因爲它實際上並沒有回答這個問題......但後來它比我意識到幫助了我。我現在將盡可能使用閉包而不是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