Использование NSPredicate для определения, равна ли строка другой строке

У меня есть NSArray из CalEvents, возвращенных методом [CalCalendarStore eventPredicateWithStartDate]. Из возвращенных событий стараюсь оставить только те, в которых заголовок события == @"on call" (без учета регистра).

Я могу сохранить в массиве те события, заголовок которых включает @"on call", с помощью следующего кода (где «события» — это «NSArray», заполненный CalEvents):

NSPredicate *onCallPredicate = [NSPredicate predicateWithFormat:@"(SELF.title CONTAINS[c] 'on call')"];
[events filteredArrayUsingPredicate:onCallPredicate];

Я пробовал использовать строку формата предиката, например:

@"SELF.title == 'on call'" но это не работает.

Есть ли более простой способ сделать это?


person Garry Pettet    schedule 03.06.2010    source источник


Ответы (2)


Попробуйте [NSPredicate predicateWithFormat:@"title ==[c] 'on call'"];

([c] делает сравнение на равенство нечувствительным к регистру.)

person Cory Kilger    schedule 03.06.2010
comment
+1, хотя вы можете добавить модификатор [c] после ==, чтобы сделать его нечувствительным к регистру. - person Dave DeLong; 03.06.2010
comment
Отредактировал его, чтобы он не был чувствительным к регистру. - person Cory Kilger; 03.06.2010
comment
Просто любопытно, будет ли MATCH[n] работать для == при использовании без каких-либо (*?.) подстановочных знаков? - person Samuel; 25.08.2016

Попробуйте предикат с форматом @"self.title like[c] 'on call'". Следующий пример кода выводит 2 строки:

NSArray* ar = [NSArray arrayWithObjects:@"on call", @"I'm on call", @"lala", @"On call", nil];
NSArray* filt = [ar filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self like[c] 'on call'"]];
NSLog([filt description]);

//Output
"on call",
"On call"
person Vladimir    schedule 03.06.2010
comment
Есть ли разница между использованием == и like для сравнения строк? - person Garry Pettet; 03.06.2010
comment
Похоже в вашем случае работают они одинаково. Но если вы хотите использовать подстановочные знаки при сравнении строк, то '==' не будет работать, и вместо этого вам нужно будет использовать LIKE. - person Vladimir; 03.06.2010