Monday, April 29, 2013

Предикаты, синтаксис формата строки Cocoa http://macbug.ru/cocoa/predformat

http://macbug.ru/cocoa/predformat

Предикаты, синтаксис формата строки

Cocoa

Анализатор строки отличается от строки выражения, переданной движку регулярных выражений. В этой статье описывается анализатор текста, а не синтаксис для движка регулярных выражений.

Основы синтаксического анализатора

Анализатор строки предиката рассматривает пробельные символы, регистр по отношению к ключевым словам, а также поддерживает вложенные скобки выражений. Анализатор не выполняет семантические проверки типов.

Переменные обозначаемые с $ (для примера $VARIABLE_NAME). ? не является допустимым шаблоном анализатора.

Формат строки поддерживает printf стиль формат для аргументов, такие как %x (см. "Форматирование строковых объектов"). Два важных аргумента: @% и %K.

  • %@ является аргументом замещения для объекта обозначающим чаще всего строку, число или дату.
  • %K является аргументом замещения для ключа пути

Когда строки переменных подставляются в строку, используя формат %@, они заключены в кавычки. Если вы хотите указать имя динамического свойства, используйте%K в строке формата, как показано в следующем примере.

NSString *attributeName = @"firstName";  NSString *attributeValue = @"Adam";  NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K like %@",          attributeName, attributeValue];  

Строка формата предиката в этом случае вычисляется как firstName like "Adam".

Одинарные или двойные кавычки переменных (или строки замещения переменной) вызываемых %@%K, или $variable следует интерпретировать в качестве литералов в строке формата и таким образом предотвращать любую подмену. В следующем примере строка формата предиката вычисляется как firstName like "%@" (обратите внимание на одинарные кавычки вокруг %@).

NSString *attributeName = @"firstName";  NSString *attributeValue = @"Adam";  NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K like '%@'",          attributeName, attributeValue];  

 

Примечание: Вы можете использовать %@ для замены выражения, но вы не можете использовать его, чтобы передать весь предикат.

Основные сравнения

=, ==
Левое выражение равно правому выражению.

>=, =>
Левое выражение больше или равно правому выражению.

<=, =<
Левое выражение меньше или равно правому выражению.

>
Левое выражение больше правого выражения.

<
Левое выражение меньше правого выражения.

!=, <>
Левое выражение не равно правому выражению.

BETWEEN
Левое выражение между ними, или равно одному из значений, указанных в правой части.

Правая часть состоит из массива с двумя значениями (массив необходим для указания порядка), задавая верхнюю и нижнюю границы. Например 1 BETWEEN { 0 , 33 }, or $INPUT BETWEEN { $LOWER, $UPPER }.

В Objective-C, вы можете создать BETWEEN предикат, как показано в следующем примере:

NSPredicate *betweenPredicate =           [NSPredicate predicateWithFormat: @"attributeName BETWEEN %@",          [NSArray arrayWithObjects:one, ten, nil]];  
Это создает предикат, который соответствует ( ( 1 <= attributeValue ) && ( attributeValue <= 10 ) ), как проилюстрированно ниже:
NSNumber *one = [NSNumber numberWithInteger:1];  NSNumber *ten = [NSNumber numberWithInteger:10];  NSPredicate *betweenPredicate =           [NSPredicate predicateWithFormat: @"attributeName BETWEEN %@",          [NSArray arrayWithObjects:one, ten, nil]];    NSNumber *five = [NSNumber numberWithInteger:5];  NSDictionary *dictionary = [NSDictionary dictionaryWithObject:five          forKey:@"attributeName"];    BOOL between = [betweenPredicate evaluateWithObject:dictionary];  if (between) {      NSLog(@"between");  }  

Предикаты булевых значений

TRUEPREDICATE
Предикат, который всегда вычисляется как TRUE.

FALSEPREDICATE
Предикат, который всегда вычисляется как FALSE.

Основные соединения предикатов

AND, &&
Логическое AND.

OR, ||
Логическое OR.

NOT, !
Логическое NOT.

Сравнение строк

Сравнение строк по умолчанию регистро и диакритически чувствительны. Вы можете изменить оператор с использованием ключевых символов c и d в квадратных скобках, чтобы указать нечувствительность к регистру и диакритическим символам соответственно, например, firstName BEGINSWITH[cd] $FIRST_NAME.

BEGINSWITH
Левое выражение начинается с правого выражения.

CONTAINS
Левое выражение содержит правое выражение.

ENDSWITH
Левое выражение оканчивается с правым выражением.

LIKE
Левое выражение равно правому выражению: ? и * разрешены как символы подстановки, где ? соответствует 1-му символу а * соответствует 0 или более символов. В Mac OS X v10.4, подстановочные символы не соответствуют символу новой строки.

MATCHES
Левое выражение равно правому, используя выражение в стиле сравнения регулярных выражений в соответствии с ICU v3.

Совокупные операции

ANY, SOME
Задает любой из элементов в следующем выражении. К примеру ANY children.age < 18.

ALL
Определяет все элементы в следующем выражении. К примеру ALL children.age < 18.

NONE
Указывает, ни один из элементов в следующем выражении. К примеру NONE children.age < 18. Это логически эквивалентно NOT (ANY ...).

IN
Эквивалент SQL оператора IN, левая сторона должна появиться в коллекции указанной с правой стороны.

Например, name IN { 'Ben', 'Melissa', 'Matthew' }. Коллекция может быть массивом, набором, или словарем в случае словаря, используются его значения.
В Objective-C, можно создать предикат, как показано в следующем примере:

NSPredicate *inPredicate =      [NSPredicate predicateWithFormat: @"attribute IN %@", aCollection];  
где aCollection может быть экземпляром NSArrayNSSetNSDictionary, или любым изменяемым из соответствующих классов.

array[index]
Определяет элемент по указанному индексу в массиве array.

array[FIRST]
Определяет первый элемент в массиве array.

array[LAST]
Определяет последний элемент в массиве array.

array[SIZE]
Определяет размер массива array.

Идентификаторы

C style identifier
Любой идентификатор в C стиле, который не является зарезервированным словом.

#symbol
Используется, для экранирования зарезервированных слов в пользовательских идентификаторах.

[\]{octaldigit}{3}
Используется для экранирования восьмеричного числа (\, затем 3 восьмеричные цифры).

[\][xX]{hexdigit}{2}
Используется для экранирования шестнадцатиричного числа (\x или \X, затем 2 шестнадцатиричные цифры).

[\][uU]{hexdigit}{4}
Используется для экранирования Unicode числа (\u или \U, затем 4 шестнадцатиричные цифры).

Литералы

Одинарные и двойные кавычки дают одинаковый результат, но они не прекращают друг друга. Например, "abc" и 'abc' являются идентичными, в то время как"a'b'c" эквивалентно разделенным пробелами конкатенации a'b'c.

FALSE, NO
Логическое ложь.

TRUE, YES
Логическое истина.

NULL, NIL
Нулевое значение.

SELF
Представляет объект оценки.

"text"
Символьная строка.

'text'
Символьная строка.

Массив из литералов разделенных запятыми
Пример: { 'comma', 'separated', 'literal', 'array' }

Стандартные обозначения целых и с фиксированной точкой
Пример: 1212.7182819.75.

С плавающей точкой записанное с экспонентой
Пример: 9.2e-5.

0x
Префикс, используемый для обозначения последовательности шестнадцатеричных цифр.

0o
Префикс, используемый для обозначения последовательности восьмеричных цифр.

0b
Префикс, используемый для обозначения последовательности двоичных цифр.

Зарезервированные слова

AND , OR , IN , NOT , ALL , ANY , SOME , NONE , LIKE , CASEINSENSITIVE , CI , MATCHES , CONTAINS , BEGINSWITH , ENDSWITH , BETWEEN , NULL , NIL , SELF ,TRUE , YES , FALSE , NO , FIRST , LAST , SIZE , ANYKEY , SUBQUERY , CAST , TRUEPREDICATE , FALSEPREDICATE

No comments:

Post a Comment