본문 바로가기

iOS

[iOS] NSPredicate 문법 정리

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 합계

 

참조

NSPredicate Cheatsheet - Realm Academy

Predicate Programming Guide - Apple Developer Documentation