2014-10-06 2 views
-1

사전 배열이 있습니다. 나는술어는 Cocoa ObjC에서 예외를 throw합니다.

ANY student.project_code BEGINSWITH[cd] "N8" 

뭔가를 시도하고 던져 오류가

문자열이 아닌 뭔가 문자열 조작을 할 수 없습니다 (좌 = <null> 우 = N8)

입니다 문제는 일부 학생들에게는 프로젝트 코드가 없다는 것입니다. 이 오류를 제거하려면 어떻게해야합니까?

당신은 대신 블록 술어 사용할 수 있습니다
+0

프로젝트 코드가없는 학생을 위해 nil 대신 빈 문자열을 저장하도록 데이터 모델을 수정할 수 있습니까? 이것은 모든 것이 문자열이기 때문에 문제를 해결할 것입니다. – Greg

+0

@PartiallyFinite 실제로 데이터는 서버에서 반환됩니다. 그러므로 그렇게 할 수는 없습니다. 그리고 여기 json은 보편적 인 클래스를 사용하여 직접 사전으로 변환됩니다. –

+0

실제로 어떤 종류의 데이터베이스도 사용하지 않으므로 대신 블록 술어를 사용할 수 있습니다. 성능은 느려지지 않고 실제 코드의 모든 기능을 사용할 수 있습니다. – Greg

답변

0

:

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

블록 술어 대신 각 개체에 대한 술어 문자열을 평가 제외하고는 정상적인 조건과 유사하다, 그것은 단순히 전달, 사용자가 제공하는 사용자 정의 블록을 호출 현재 검사중인 개체이며 개체가 규칙과 일치하면 YES을 반환하고 그렇지 않으면 NO을 반환합니다. 이렇게하면 블록에서 모든 코드를 실행할 수 있으므로 훨씬 더 많은 유연성을 얻을 수 있으며 SQL 스타일 조건에만 국한되지 않습니다.

위의 코드는 각각 project_code 키를 가진 사전 배열을 필터링하기위한 조건부를 만듭니다 (키가 존재하지 않으면 메서드가 nil을 반환하므로 검사가 false가됩니다. 어쨌든 원하는 것입니다).).

관련 문제