<aside> 💡 [NSPredicate](<https://doldamul.notion.site/NSPredicate-bc6a750a7ed7485884d790c9b453d8e8>)에서 제공하는 양식에 맞추어 다양한 논리적 조건을 문자열로 작성할 수 있다.

<aside> <img src="/icons/list_blue.svg" alt="/icons/list_blue.svg" width="40px" /> 목차

</aside>

</aside>

개요

predicate은 주어진 객체에 대해 조건으로부터 논리값(Boolean)을 반환하는 구문 단위로서, 표현식(expression)과 연산자(operator)의 조합으로 이루어진다.

NSPredicate 문자열 parsor(양식 해석 엔진)는 공백 처리에 영향을 받지 않고, 키워드에 대해 대소문자를 구별하지 않으며, 괄호가 중첩된 표현식을 지원한다. 또한 의미 분석 및 타입 검사를 수행하지 않는다. 즉 문자열 내에서 keypath가 잘못되었거나 문법적 오류가 있을 때 디버깅이 어렵고 런타임 에러까지 이어질 수 있으므로 주의해야 한다.

문자열 양식을 사용할 경우 일반적으로 init(format: String, CvarArg...) 생성자를 사용한다. format: String에 문자열 양식, _: CvarArg…에 문자열에서 사용될 인자들을 나열한다. 생성된 predicate에 필터링할 객체들을 전달하는 것으로 필터링(=평가)을 수행할 수 있다.

init(format: "%K IN %@", "age", [23, 19, 31])

생성자 및 평가 함수의 사용법은 [NSPredicate](<https://doldamul.notion.site/NSPredicate-bc6a750a7ed7485884d790c9b453d8e8>) 장을 참조하자.

서식문자

서식문자는 문자열 보간법을 사용하여 다양한 종류의 복잡한 문자열을 ‘예약어 + 인자’ 조합으로 삽입할 수 있도록 지원한다. 서식문자도 표현식의 한 종류로 분류되지만, 핵심적인 개념이라는 차원에서 별개의 장으로 분리했다.

predicate은 ANSI-C의 printf() 함수에서 지정한 서식문자를 동일하게 지원한다. % 기호는 인자를 지칭하는 placeholder임을 나타내며, 다음 두 서식문자가 가장 많이 쓰인다.

이 외에도 다양한 %예약어를 지원한다. 다음 링크에서 그 목록을 확인할 수 있다: developer.apple.com/archive: String Format Specifiers

predicate에서만 지원하는 전용 서식문자도 있다.

<aside> 💡 서식문자들을 작은 따옴표 또는 큰 따옴표로 감쌀 경우, 명령어로 처리되지 않고 문자열 리터럴로 처리된다.

</aside>

<aside> ❗ NSPredicate 사용시 Swift의 문자열 보간법 때문에 에러가 발생할 수 있으므로 주의가 필요하다.

❌ init(format: "\\(변수)")

✅ init(format: "%@", 변수)

NSPredicate 문자열 parsor는 Obj-C 스타일의 문자열 보간법을 사용하며, Swift의 문자열 보간법은 Obj-C 스타일과는 서로 다른 형식의 문자열을 생성한다. 따라서 문자열에 인자를 포함할 경우엔 반드시 위에 서술된 Obj-C 스타일 양식($, %@, %K 등)을 사용해야 한다.

</aside>

predicate 연산자