NSArray를 필터링 할 때, CoreData를 사용할 때 Predicate 문법을 사용하여 필터링 하곤 합니다. 이 때 주로 사용하는 문법들을 정리해보겠습니다.
let request: NSFetchRequest<Entity> = Entity.fetchRequest()
let predicate = NSPredicate(format: "id == %@", id)
request.predicate = predicate
CoreData에서 데이터 조회(fetch)할 때 사용하는 방식은 대부분 위와 같을 것 입니다. NSPredicate 생성자 중 format 문자열에 검색조건을 지정하는 방법을 주로 사용합니다. format 문자열은 대소문자를 구별하지 않습니다. Predicate Keyword 들은 대문자로 작성하는 것이 가독성에 좋습니다. (SQL 처럼!? 😎) 또한 문자열 안의 두 개 이상의 공백은 하나로 처리됩니다.
let request: NSFetchRequest<Entity> = Entity.fetchRequest()
let predicate = NSPredicate(format: "%K < %@", #keyPath(Entity.date), Date() as NSDate)
request.predicate = predicate
위와 같이 %K 를 활용하면 속성 이름을 동적으로 전달하는 것도 가능합니다. 오타로 인한 불필요한 오류를 줄일 수 있겠죠! 👍
기본 표현식
Boolean | YES/NO, TRUE/FALSE 모두 가능 |
Array | {1, 2, 3, 4} |
String | 'abc', \"abc\" 모두 가능 |
nil | NULL, NIL 모두 가능 |
기본 비교 연산자
=, == | 같다 |
>=, => | 이상 |
<=,=< | 이하 |
> | 초과 |
< | 미만 |
!=, <> | 다르다 |
IN |
포함되다 ex) value IN {"A", "B", "C"} |
BETWEEN |
범위에 속하다 ex) 10 BETWEEN {1, 30} |
혼합 연산자
AND, && | 교집합 |
OR, || | 합집합 |
NOT, ! | 여집합 |
문자열 비교 연산자
BEGINSWITH | 접두어 비교 |
ENDSWITH | 접미어 비교 |
CONTAINS |
문자열의 포함여부 ex) 'b' CONTAINS 'abc' |
LIKE |
패턴 비교 (?는 하나의 문자, *는 하나 이상의 문자나 문자가 없음을 표현) ex) 'abcabc' LIKE '*ca*' |
문자열 비교 옵션
문자열을 비교할 때는 기본적으로 대소문자를 구분합니다.
[c] |
대소문자 무시 ex) 'hello' BEGINSWITH[c] 'Hello World' |
[d] |
악센트 기호 무시 ex) 'cafe' CONTAINS[d] 'café' |
[cd] | 둘 다 무시 |
집계 연산자
ANY, SOME |
조건을 만족하는 데이터가 하나라도 존재하면 true ex) ANY age >= 30 |
ALL | 모든 데이터가 해당 조건을 만족하면 true |
NONE | 조건을 만족하는 데이터가 하나도 없으면 true |
배열 Subscript
array[index] |
해당 인덱스에 해당하는 데이터 ex) employees[3].age > 30 |
array[FIRST] | 첫 번째 데이터 |
array[LAST] | 마지막 데이터 |
array[SIZE] |
배열의 사이즈 ex) employees[SIZE] == 10 |
컬렉션 연산자
해당 연산자는 컬렉션 타입에만 사용이 가능합니다.
@avg |
평균 ex) employees.@avg.age > 30 |
@count |
개수 ex) employees.@count > 15 |
@min | 최소값 |
@max | 최대값 |
@sum | 합계 |
참조
'iOS' 카테고리의 다른 글
[iOS] DispatchSourceTimer로 일시정지 구현이 쉬운 타이머 만들기 (0) | 2020.04.15 |
---|---|
[iOS] 클래스의 모든 프로퍼티들이 궁금할 땐? (0) | 2020.02.29 |
[iOS] fullScreen? overFullScreen? over가 붙으면 무엇이 다를까 (UIModalPresentationStyle) (0) | 2020.01.15 |
[iOS] 로컬 푸쉬 알림 구현 방법 (Local Notification) (1) | 2020.01.11 |
[iOS] 웹뷰에서 숫자 키패드로 뜨지 않을 경우 해결방법 (0) | 2019.12.16 |