2014-10-06 88 views
-1

我有一個字典數組。我想是這樣謂詞拋出異常在可可ObjC

ANY student.project_code BEGINSWITH[cd] "N8" 

拋出的錯誤是

不能做的東西一個子操作不是一個字符串(左= <null> RHS = N8)

問題是有些學生沒有項目代碼。我如何擺脫這個錯誤?

+0

您是否可以修改您的數據模型以存儲空字符串而不是零,以便沒有項目代碼的學生使用?這將解決問題,因爲一切都將是一個字符串。 – Greg 2014-10-06 11:14:00

+0

@PartiallyFinite其實數據是從服務器返回的。因此,這是不能做到的。在這裏,json被直接轉換爲使用通用類的字典。 – 2014-10-06 12:00:48

+0

由於您實際上並未使用任何類型的數據庫,因此您可以使用塊謂詞代替 - 性能不會變慢,並且您將獲得實際代碼的全部功能。 – Greg 2014-10-06 12:07:12

回答

0

您可以使用塊謂詞來代替:

NSPredicate *p = [NSPredicate predicateWithBlock:BOOL ^(id evaluatedObject, NSDictionary *bindings) { 
    return [((NSDictionary *)evaluatedObject)["@project_code"] hasPrefix:@"N8"]; 
}]; 

塊謂詞是類似於正常謂詞,除了沒有評估針對每一個對象謂詞字符串,它只是調用您提供的自定義模塊,將其傳遞當前正在測試的對象,如果對象符合您的規則,則返回YES,否則返回NO。這樣可以提供更大的靈活性,因爲您可以在塊中運行任何代碼,並且不受SQL樣式條件的限制。

上面的代碼創建了一個謂詞,用於過濾字典數組,每個字典都有一個project_code鍵(如果鍵不存在,該方法將返回nil,因此該檢查將爲false,這正是您想要的)。