2013-07-10 151 views
3

我想對對象數組做一個簡單的謂詞過濾器。CONTAINS上的NSPredicate崩潰?

數組中的對象具有2個屬性displayValue和value。我正在嘗試基於搜索字符串進行過濾,並且發生崩潰。

NSPredicate *pred = [NSPredicate predicateWithFormat:@"displayValue CONTAINS[cd] %@", searchString]; 
    NSArray *results = [_data filteredArrayUsingPredicate:pred]; 

這種格式究竟是不正確的,它導致Can't use in/contains operator with collection 100 (not a collection)崩潰?

+0

你能說明數組中的對象是如何定義的嗎? –

+0

他們只是分配數據。 'MyObject * myObject = [MyObject alloc] init]; myObject.dataValue = @「dasfasfsa」 – JMD

+0

你是指對象中的屬性? – JMD

回答

10

我能夠重現您的問題。如果其中一個對象 的displayValue不是NSString,而是某種不同的類型,則會發生這種情況。

從你的錯誤信息,我假設你分配一個NSNumber,例如

obj.displayValue = @100; 

在你的代碼的某個地方。 「CONTAINS」謂詞僅與字符串一起使用,因此您只能將 字符串值分配給屬性。

因此,您應該將屬性的類型定義爲 NSString *而不是id,並檢查該屬性的分配。

如果您確實需要保留id類型並在該屬性中存儲不同種類的對象,則 則不能在謂詞中使用「CONTAINS」運算符。然而,直接比較 與@"displayValue == %@"會起作用。

UPDATE:作爲一種變通方法,您可以使用description方法,它的任何對象 轉換爲字符串,尤其是它NSNumber轉換爲它的字符串表示。所以以下可以工作:

[NSPredicate predicateWithFormat:@"displayValue.description CONTAINS[cd] %@", searchString]; 

的缺點是準確的description格式不記錄。

另一種解決方案可能是使用基於塊的謂詞,您可以在其中檢查每個對象的類型 並執行適當的比較。

+0

我不能改變displayValue的賦值,而不會在所有地方打破東西。由於我不能使用包含,有沒有辦法使用displayValue作爲id來過濾數組,但以某種方式將它轉換爲字符串? – JMD

+0

@JMD:看到更新的答案,希望它有幫助! –

+0

您的更新似乎有效。我必須做一些調整,但大部分似乎是這樣做的。謝謝! – JMD