2012-12-16 6 views
1

술어 사용법을 이해할 수 없으며 속성 "type"에 의해 배열에서 개체를 필터링하는 데 매우 긴 코드를 가지고 갑자기 "filteredArrayUsingPredicate"메서드를 보았습니다. 내 인생을 더 좋게 만들 수있다. 나는 술어를 쓰려고 노력하지만 항상 오류가 발생한다. 누군가가 저에게 그것을 올바르게 쓰는 방법을 보여줄 수 있습니까?filtersArrayUsingPredicate 메서드를 사용하여 속성별로 배열에서 개체 필터링

I는 객체 (이벤트)을 가진 배열을 : 있는 NSArray * eventsArray

나는 방법 - (void) filterData: (NSString *)filteredWord있다. filtersArrayUsingPredicate를 사용하여 속성 (유형)이 동일한 filterWord가있는 객체 (이벤트)로 새 배열을 가져 오려고합니다. 이벤트는 핵심 데이터 관리 하위 클래스입니다.

조건 자로도이 작업을 수행 할 수 있습니까? 내 시도

하나 :

NSString *propertyName = @"type"; 
NSArray *eventsArray = [[[[self currentPerson] events] objectEnumerator]allObjects]; 
NSPredicate *predicte = [NSPredicate predicateWithFormat:@"%k like '%@'",propertyName,filteredWord]; 
[eventsArray filteredArrayUsingPredicate:predicte]; 

답변

2

이 시도 :

NSString *propertyName = @"type"; 
NSArray *eventsArray = [[[self currentPerson] events] allObjects]; 
NSPredicate *predicte = [NSPredicate predicateWithFormat: 
         @"%k like %@",propertyName, filteredWord]; 
NSArray *filteredArray = [eventsArray filteredArrayUsingPredicate:predicte]; 

당신은 필터링 된 결과를 무시합니다. filteredArrayUsingPredicate: 인스턴스를 NSArray으로 반환합니다. NSArray 개체는 변경할 수 없기 때문에 원래의 배열을 필터링하지 않습니다. 당신도

(... 그것은 등, 그 로그 저장) 당신이 filteredArrayUsingPredicate:의 반환 된 배열로 뭔가를해야 장소에 배열을 필터링 할 filterUsingPredicate:를 사용하여 다음 NSMutableArray 을하고, 또는 속성 주위에 작은 따옴표를 사용하지 마십시오. (단서 @ MartinR에 대한 감사)

+0

당신의 의견을 좀 주셔서 감사합니다. 나는 예측에 대해 조금은 이해하지만, 필자가 필터링 된 유형을 가진 객체가 더 많을 경우 filtersArray에 0 객체가 있습니다. 이벤트는 NSSET이므로'[[array objectEnumerator] allObjects]'를 사용합니다. – Dennis

+0

그런 경우'[set allObjects]'를 사용할 수 있습니다. 열거자를 필요가 없습니다. 또한 UIEvent의 type 속성은 문자열이 아닙니다. 열거 형 (정수)입니다. 내 업데이트 답변을 참조하십시오. – DrummerB

+0

실제로 "% FF"대신 "% K"을 사용할 수도 있습니다. "% K"는 술어의 키 경로에 대한 var arg 대체입니다. - 그리고 나는 (Dennis의 이전 질문에서)'Event'가 핵심 데이터 관리 객체 서브 클래스이고'UIEvent'와 관련이 없다는 것을 알게되었습니다. 따라서 "% K LIKE % @"가 작동해야합니다. –