사전 배열이 있습니다. 나는술어는 Cocoa ObjC에서 예외를 throw합니다.
ANY student.project_code BEGINSWITH[cd] "N8"
뭔가를 시도하고 던져 오류가
문자열이 아닌 뭔가 문자열 조작을 할 수 없습니다 (좌 = <null>
우 = N8)
입니다 문제는 일부 학생들에게는 프로젝트 코드가 없다는 것입니다. 이 오류를 제거하려면 어떻게해야합니까?
당신은 대신 블록 술어 사용할 수 있습니다사전 배열이 있습니다. 나는술어는 Cocoa ObjC에서 예외를 throw합니다.
ANY student.project_code BEGINSWITH[cd] "N8"
뭔가를 시도하고 던져 오류가
문자열이 아닌 뭔가 문자열 조작을 할 수 없습니다 (좌 = <null>
우 = N8)
입니다 문제는 일부 학생들에게는 프로젝트 코드가 없다는 것입니다. 이 오류를 제거하려면 어떻게해야합니까?
당신은 대신 블록 술어 사용할 수 있습니다:
NSPredicate *p = [NSPredicate predicateWithBlock:BOOL ^(id evaluatedObject, NSDictionary *bindings) {
return [((NSDictionary *)evaluatedObject)["@project_code"] hasPrefix:@"N8"];
}];
블록 술어 대신 각 개체에 대한 술어 문자열을 평가 제외하고는 정상적인 조건과 유사하다, 그것은 단순히 전달, 사용자가 제공하는 사용자 정의 블록을 호출 현재 검사중인 개체이며 개체가 규칙과 일치하면 YES
을 반환하고 그렇지 않으면 NO
을 반환합니다. 이렇게하면 블록에서 모든 코드를 실행할 수 있으므로 훨씬 더 많은 유연성을 얻을 수 있으며 SQL 스타일 조건에만 국한되지 않습니다.
위의 코드는 각각 project_code
키를 가진 사전 배열을 필터링하기위한 조건부를 만듭니다 (키가 존재하지 않으면 메서드가 nil을 반환하므로 검사가 false가됩니다. 어쨌든 원하는 것입니다).).
프로젝트 코드가없는 학생을 위해 nil 대신 빈 문자열을 저장하도록 데이터 모델을 수정할 수 있습니까? 이것은 모든 것이 문자열이기 때문에 문제를 해결할 것입니다. – Greg
@PartiallyFinite 실제로 데이터는 서버에서 반환됩니다. 그러므로 그렇게 할 수는 없습니다. 그리고 여기 json은 보편적 인 클래스를 사용하여 직접 사전으로 변환됩니다. –
실제로 어떤 종류의 데이터베이스도 사용하지 않으므로 대신 블록 술어를 사용할 수 있습니다. 성능은 느려지지 않고 실제 코드의 모든 기능을 사용할 수 있습니다. – Greg