[iOS/OSX] predicate를 사용한 배열의 필터

배열을 필터하기

특정한 값을 만족하는 원소만을 추출하여 부분 집합을 구하는 작업을 종종 해야 할 때가 있다. 배열에 대한 정렬 보다 간단하다면 간단하고 어렵다면 어려운데, predicate를 사용하면 쉽게 추출이 가능한데, 이 predicate를 사용하는 문법이 별도로 존재하기 때문에 조금 성가실 수 있다. (하지만 영문법과 크게 다르지 않다)

NSMutaleArray *array = [NSMutableArray arrayWithObjects:@"Bill", @"Ben", @"Chris", @"Melisa", nil];
NSPredicate *bPredicate = [NSPredicate predicateWithFormat:@"SELF beginsWith:'b'"];
NSArray *beginWithB = [array filteredArrayUsingPredicate:bPredicate];
// ==> { @"Bill", @"Ben" }

predicate는 너무 깊이 파면 복잡하므로 일종의 쿼리문이며, 대략 다음과 같은 포맷과 문법이 있다고 알아두자.

  • %@ : 하나의 객체로 치환한다.
  • %K : 하나의 문자열로 치환한다. 이는 비교하고자 하는 키패스가 된다.
  • = / == : 두 항이 같다.
  • >= / => : 왼쪽이 크거나 같다.
  • <= / =< : 오른쪽이 크거나 같다.
  • > : 왼쪽이 크다
  • < : 오른쪽이 크다.
  • != / <> : 같지 않다.
  • BETWEEN : 사이에 있다 – 1 BETWEEN {0,3}
  • TRUEPREDICATE : 항상 TRUE
  • FALSEPREDICATE : 항상 FALSE
  • AND / && : 논리곱
  • OR / || : 논리합
  • NOT / ! : 논리 부정
  • 문자열 비교시 [cd] 토큰 : c는 대소문자구분하지 않음, d는 공백등을 무시
  • BEGINSWITH : 첫글자가 ~로 시작함
  • ENDSWITH : 마지막이 ~로 끝남
  • CONTAINS : ~를 포함함
  • LIKE : ~와 유사함
  • MATCHES : 정규식을 사용함
  • IN : 비교항이 특정 집합에 포함됨

언제나 그렇지만 자세한 내용은 개발자 문서를 참고하면 된다.