개발을 하다보면 배열을 정말 많이 사용한다. 그리고 그 배열안에 있는 데이터를 추가/삭제도 많이 하고 그 배열 안에 데이터가 있는지 없는지 여부에 대해서도 많이 찾아 본다. 배열안에 있는 단순한 값들을 비교 할때는 – (BOOL)containsObject:(ObjectType)anObject; 를 사용하면 배열안에 포함되어있는 여부에 대해서 bool값으로 받을 수 있어 편하게 잘 쓸 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 |
NSArray * stringArray = @[@"string", @"lotco", @"해달", @"치킨", @"피자", @"야호",]; if ([stringArray containsObject:@"해달"]) { NSLog(@"해달이 안에 있습니다"); } |
하지만 배열안에 단순한 값이 아닌 객체가 들어있을경우는 사용 할 수가 없다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
NSArray * array = @[ @{name:@"치킨", age:@10}, @{name:@"피자", age:@20}, @{name:@"해달", age:@7}, @{name:@"야호", age:@48}, @{name:@"푸딩", age:@154}, @{name:@"삼겹살", age:@12}, ]; if ([array containsObject:@"해달"]) { NSLog(@"해달이 안에 있습니다"); } else { NSLog(@"해달이 안에 없습니다"); } |
이럴때는 두가지 방법이 있다. 하나는 for문등을 사용하여 배열안에 있는 값들을 다 하나씩 비교하여 해당 값을 비교하는 방법이랑
1 2 3 4 5 |
for (NSDictionary *inDictionary in array) { if ([inDictionary[age] isEqualToNumber:@7]) { NSLog(@"%@은 나이가 7살입니다 ", inDictionary[name]); } } |
NSPredicate를 사용하여 검색 조건을 텍스트로 입력하여 검색하는 방법이 있다. 물론 NSPredicate를 사용하는 방법이 훨씬 깔끔하고 조건이 중첩되거나 유지보수 할때 훨씬 편하다.
1 2 |
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K = %@",age, @7]; NSArray *resultArray = [array filteredArrayUsingPredicate:predicate]; |
NSPredicate를 사용하면 객체 안의 값을 찾거나 여러 중복 조건등 사용하기가 매우 편하지만 처음에 검색 문법을 배우는게 조금 어렵다. 해당 검색 조건에 애플 가이드 문서를 보면 자세히 나와있다.