2012-05-08 2 views
11

NSDictionary 객체의 NSArray가 있습니다. NSPredicate를 사용하여 사전의 키를 기반으로 배열을 필터링하고 싶습니다. 나는 이런 식으로 일을했습니다 :NSPredicate를 사용하여 NSDictionary 객체의 NSArray 필터링

NSString *predicateString = [NSString stringWithFormat:@"%@ == '%@'", key, value]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString]; 
NSArray *filteredResults = [allResultsArray filteredArrayUsingPredicate:predicate]; 

전달 된 키가 1 워드 : 색상, 이름, 나이 인 경우 제대로 작동합니다. 그러나 키가 여러 단어 인 경우 Person Age, Person Name과 같이 작동하지 않습니다.

기본적으로 공백이있는 키는 작동하지 않습니다. 나는 문자열에서 키 주위에 작은 따옴표를 넣으려고 시도했다. 마치 값 측면에서 수행 된 것처럼 하나도 작동하지 않았다. 또한 큰 따옴표를 시도했지만 아무 소용이 없습니다.

이 부분에 대해 알려주십시오. 미리 감사드립니다.

+2

시도의 %의 K는 - 그것은 핵심 데이터에 작업 괜찮 – user170317

+0

[작동하지 않는 자 NSPredicate 형식 문자열 (의 중복 가능성 http://stackoverflow.com/questions/12413929/nspredicate-format -string-doesnt-work) – Monolo

답변

16

동적 키를 사용하는 경우 %@ 대신 토큰을 사용해야합니다. 또한 값 토큰 주위에 따옴표가 필요하지 않습니다. 술어는 value 대신에 리터럴 문자열 @"%@"에 대한 동등성을 테스트하게됩니다.

NSString *predicateString = [NSString stringWithFormat:@"%K == %@", key, value]; 

이 내용은 Predicate Format String Syntax guide에 설명되어 있습니다.


편집 : Anum Amin은 지적한 것처럼 +[NSString stringWithFormat:]은 술어 형식을 처리하지 않습니다. 대신 [NSPredicate predicateWithFormat:@"%K == %@", key, value]을 원합니다.

+5

NSString은 % K를 올바르게 대체하지 않습니다. 하나는'[NSPredicate predicateWithFormat :]'를 사용해야합니다. 아래 내 대답을 참조하십시오. – NightFury

+0

@AnumAmin : 당신은 절대적으로 맞습니다. Bittu의 코드를 새로 작성하는 대신 "수정"하려고 시도한 것으로 생각합니다. 나는 심지어 그가 내 대답을 받아 들인 것에 놀랐다. –

+0

이미 NSPredicate predicateWithFormat을 사용하고있었습니다. 따라서 NSString을 작성하기위한 별도의 명령문 대신 해당 명령문에서 쉽게 수행 할 수있었습니다. 나는 코멘트에서 그것을 분명히 했어야하지만 Anum은 잘 해냈다 :) – Bittu

23

나를 위해, 케빈의 대답은 작동하지 않았습니다. 내가 사용 :

NSPredicate *predicateString = [NSPredicate predicateWithFormat:@"%K contains[cd] %@", keySelected, text];//keySelected is NSString itself 
     NSLog(@"predicate %@",predicateString); 
     filteredArray = [NSMutableArray arrayWithArray:[YourArrayNeedToFilter filteredArrayUsingPredicate:predicateString]]; 
+0

집에서 놀고있는 사람들을 위해, 선택 사항 인'[cd]'는 대소 문자 구별과 분감 부호를 구분하지 않는다. – smacdonald

관련 문제