2016-12-05 49 views
0

我必須擁有兩個實體。一個實體Person,另一個Message。對於每一個人來說,都有很多信息(所以有一對多的關係)。我需要用人員填充我的tableView,但是隻有擁有至少一條消息且具有屬性sent等於success的消息的人員。如何使用NSPredicate進行篩選,基於多對多關係集是否包含特定值

如果我說的是不明確的,這裏基本上是我想:

(顯然這不能編譯,我完全由它的問題的緣故)NSPredicate(Person.messages.contains (sent == "success")

編輯: 忘了提及我正在使用Core - Data,而不僅僅是一個普通的數組。我需要NSPredicate來獲取結果控制器。

+0

什麼是你的謂語中的「朋友」? –

+0

讓我編輯,我的意思是人。對不起 – Ryan

+1

像NSPredicate(格式:「任何messages.sent ==%@」,「成功」)應該工作。你看過https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Predicates/AdditionalChapters/Introduction.html嗎? –

回答

1

「ANY」可與多對多關係一起使用來查找至少有一個相關對象滿足 條件的對象。在你的情況下:

NSPredicate(format: "ANY messages.sent == %@", "success") 
0

你可以迅速陣列上使用過濾功能,像這樣:

struct Person { 

    var name: String? 
    var meessages = [Message]() 
} 


struct Message { 

    var sent: Bool = false 
} 


let arr: [Person] = [ 
    Person(name: "person1", meessages: [Message(sent: true), Message(sent: false)]), 
    Person(name: "person2", meessages: [Message(sent: false), Message(sent: false)]), 
    Person(name: "person2", meessages: [Message(sent: true), Message(sent: true)]) 
] 

let filtered = arr.filter({ ($0.meessages.filter({ $0.sent == true })).count > 0 }) 
+0

ThomasG,非常感謝你的回答,儘管我需要一個NSPredicate核心數據用於我提取的結果控制器,但我應該更清楚。 – Ryan

0

那是因爲你的人陣應的NSArray,NSPredicates僅適用於Foundation對象 你有濾波方法不迅速types.in斯威夫特陣列是您可以調用並通過過濾關閉。

相關問題