2013-10-02 112 views
0

我有一個名爲comboData NSMutableArray而我試圖篩選出:NSPredicate和過濾

NSMutableArray * filteredVersion = [[NSMutableArray alloc] init]; 
    NSPredicate *predicate  = [NSPredicate predicateWithFormat:@"id >= %d AND id <= %d",1,7]; 
    [filteredVersion setArray: [comboData filteredArrayUsingPredicate: 
          predicate] 
         ]; 

我在第二條線得到一個unknown selector錯誤信息

[__NSCFNumber length]: unrecognized selector sent to instance 0xa966350 

。 我(重新)失蹤了什麼?

[編輯]

的comboData是如下(在調試區域打印出來)

combo data (
    { 
    id = 1; 
    label = "A"; 
    name = ''; 

}, 
    { 
    id = 2; 
    label = "B"; 
    name = ''; 

}, 
+0

請添加異常斷點以查找崩潰的行。 – Fogmeister

+0

這是最後一個,當我打電話給setArray ... – giuseppe

+0

請你可以顯示setArray函數的代碼。 – Fogmeister

回答

1

行,所以你的陣列comboData填充有NSDictionaries

一個NSDictionary只能包含對象。

它看起來像鑰匙id引用一個數字,因此它將是一個NSNumber

在您的謂詞中,您將它視爲int。

你需要像這樣...

// erm... not sure. Can you not just use a comparator? 
// NSPredicate *predicate = [NSPredicate predicateWithFormat:@"id >= %d AND id <= %d",1,7]; 

NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(NSDictionary *dictionary, NSDictionary *bindings) { 
    NSNumber *idNumber = dictionary[@"id"]; 

    return [idNumber intValue] >= 1 && [idNumber intValue] <= 7; 
}]; 

這應該工作。

只需使用它來代替當前的謂詞。

+0

太棒了!這是最簡單的解決方案嗎? – giuseppe

+0

我這麼認爲。我不認爲'predicateWithFormat'對於處理對象非常有用。不是100%確定。 – Fogmeister

+0

不幸的是,當我執行你的代碼時,我有一個匿名崩潰:這是我的實現: double maxDistance = 0.0003; NSPredicate * nearPredicate = [NSPredicate predicateWithBlock:^ BOOL(NSDictionary * dictionary,NSDictionary * bindings){ NSNumber * idNumber = dictionary [@「Distance」]; return [idNumber doubleValue]