Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Objective-C

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.94
noname_club
103 / 94 / 10
Регистрация: 01.05.2013
Сообщений: 598
#1

ObjectiveC предикаты, упрощенный метод - Objective-C

09.07.2013, 12:58. Просмотров 2173. Ответов 18
Метки нет (Все метки)

Предикаты в Obj C, как известно, используются там, где нужно фильтровать или найти, сравнить данные

Остановимся на наиболее распространненых случаях использования предикатов

- фильтр строкового массива
- сравнение строк

заглянем в документацию
http://macbug.ru/cocoa/predformat#.URul8OjoRGM

после прочтения становиться ясно что в том виде к каком предикаты существуют в ObjC использовать не вполне удобно.

Проведем классификацию типов выражений с предикатами в макросы

// Предикаты
Objective-C
1
2
3
4
5
6
7
8
9
10
11
#define fi_start @"BEGINSWITH[cd]"
#define fi_end @"ENDSWITH[cd]"
#define fi_like @"LIKE[cd]"
#define fi_include @"CONTAINS[cd]"
#define fi_regular @"MATCHES[cd]"
 
#define fs_start @"BEGINSWITH"
#define fs_end @"ENDSWITH"
#define fs_like @"LIKE"
#define fs_include @"CONTAINS"
#define fs_regular @"MATCHES"
префиксы означают:

fs - чувствительны к регистру
fi - не чувствительны к регистру

Расшифровка названий

start - совпадание по началу строки
end - совпадение по концу строки
like - похож на SQL like, ? соответствует 1-му символу, * соответствует 0 или более символов

include - совпадение по подстроке (строка содержит строку)
regular - совпадение по регулярному выражению

Исходный код функций

SimplePredicate.h
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// упрощенные предикаты
// FreeSoft 2013
 
#define fi_start @"BEGINSWITH[cd]"
#define fi_end @"ENDSWITH[cd]"
#define fi_like @"LIKE[cd]"
#define fi_include @"CONTAINS[cd]"
#define fi_regular @"MATCHES[cd]"
 
#define fs_start @"BEGINSWITH"
#define fs_end @"ENDSWITH"
#define fs_like @"LIKE"
#define fs_include @"CONTAINS"
#define fs_regular @"MATCHES"
 
#import <Foundation/Foundation.h>
 
@interface NSString (NSString_SimplePredicate)
 
-(bool) predicateMatch:(NSString*) filter
                value: (id) value;
 
@end
 
@interface NSArray (NSArray_SimplePredicate)
 
-(NSArray*) predicateFilter: (NSString*) filter
                      value: (id) value;
 
@end
SimplePredicate.m
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// упрощенные предикаты
 
 
#import "SimplePredicate.h"
 
@implementation NSString (NSString_SimplePredicate)
 
 
-(bool) predicateMatch:(NSString*) filter
                 value: (id) value {
    // функция сравнения строк через выражения
    NSString *p1 = [NSString stringWithFormat:@"SELF %@ %%@",filter];
    NSPredicate *regexp = nil;
    if (value) {
        regexp = [NSPredicate predicateWithFormat:p1,value];
    }
    return [regexp evaluateWithObject:self];
}
 
@end
 
@implementation NSArray (NSArray_SimplePredicate)
 
-(NSArray*) predicateFilter: (NSString*) filter
                      value: (id) value {
    // функция фильтрации массивов
    NSString *p1 = [NSString stringWithFormat:@"SELF %@ %%@",filter];
    NSPredicate *regexp = nil;
    if (value) {
        regexp = [NSPredicate predicateWithFormat:p1,value];
    }
    return [self filteredArrayUsingPredicate:regexp];
}
 
@end
Использование

если нужно сравнить строку с другой строкой то

Objective-C
1
2
3
4
5
6
7
 NSString* s = @"Helo world";
    
    bool ok = [s predicateMatch:fs_start value:@"Helo"];
    
    if (ok) {
        NSLog(@"есть совпадение");
    }
то есть не нужно запоминать какой предикат как пишется и как составляется, достаточно написать префикс fs fi чтобы xcode сам подсказал каким предикатом можно воспользоваться

Мануал по регуляркам тут
http://userguide.icu-project.org/strings/regexp
однако можно воспользоваться более "понятным" мануалом например по php или JavaScript, выражения практически идентичны

пример с регулярным выражением

Objective-C
1
2
3
4
5
6
7
NSString* s = @"Helo world";
    
    bool ok = [s predicateMatch:fi_regular value:@"h\\w+\\s\\w+"];
 
   if (ok) {
        NSLog(@"есть совпадение");
    }

Тестовая программа

ObjectiveC предикаты, упрощенный метод

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
-(void) ShowMessage: (bool) ok {
    if (ok) {
        UIAlertView *a = [[UIAlertView alloc] initWithTitle:@"" message:@"Есть совпадение" delegate:nil cancelButtonTitle:@"ok" otherButtonTitles: nil];
        [a show];
    } else {
        UIAlertView *a = [[UIAlertView alloc] initWithTitle:@"" message:@"НЕТ совпадения" delegate:nil cancelButtonTitle:@"ok" otherButtonTitles: nil];
        [a show];
    }
}
 
-(void) ShowArray: (NSArray*) ar {
    NSString *sa = [ar componentsJoinedByString:@"\n"];
    UIAlertView *a = [[UIAlertView alloc] initWithTitle:@"" message:sa delegate:nil cancelButtonTitle:@"ok" otherButtonTitles: nil];
    [a show];
}
 
- (IBAction)btn_start:(id)sender {
    NSString* s = @"Helo world";
    
    bool ok = [s predicateMatch:fs_start value:@"Helo"];
    
    [self ShowMessage:ok];
    
}
 
- (IBAction)btn_include:(id)sender {
    NSString* s = @"Helo world";
    
    bool ok = [s predicateMatch:fs_include value:@"o worl"];
    
    [self ShowMessage:ok];
    
}
 
- (IBAction)btn_regular:(id)sender {
    NSString* s = @"Helo world";
    
    bool ok = [s predicateMatch:fi_regular value:@"h\\w+\\s\\w+"];
    
    [self ShowMessage:ok];
}
 
- (IBAction)btn_like:(id)sender {
    NSString* s = @"Helo world";
    
    bool ok = [s predicateMatch:fi_like value:@"Helo ??rld"];
    
    [self ShowMessage:ok];
 
}
 
- (IBAction)btn_filter:(id)sender {
    NSArray* array = [NSArray arrayWithObjects:@"hello",@"world",@"pen",@"dog",@"xOx", nil];
    
    NSArray* result = [array predicateFilter:fi_include value:@"o"];
    
    [self ShowArray:result];
    
}
0
Вложения
Тип файла: zip test_predicates.zip (78.2 Кб, 4 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.07.2013, 12:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос ObjectiveC предикаты, упрощенный метод (Objective-C):

Нужен самоучитель по ObjectiveC - Objective-C
Здравствуйте! Подскажите пожалуйста хороший самоучитель по objective-c (можно и видео уроки) и что надо для разработки под ios какое по и...

С чего начать вводную в программирование, и дойти до ObjectiveC? - Objective-C
Всем добрый день и хорошего дня) Для многих моя тема будет обыденностью и нубством а для кого то и бредом, но прошу сильно не флудить и...

упрощенный RegexKitLite - Objective-C
phpRegexKitLite.h // PHPregexKitLite #import &lt;Foundation/Foundation.h&gt; #import &quot;RegexKitLite.h&quot; #ifndef...

Предикаты и метод резолюции - Логика и множества
Ребят, помогите, пожалуйста, последний зачет остался, вообще в этом не шарю.. Чтобы не дублировать, задание на на картинке

Встроенные предикаты. Предикаты взаимодействия, размещение данных - Prolog
Есть три вопроса: С равенством разобрался, вроде ничего сложного. Про предикаты нашел много инфы, но про предикаты взаимодействия и...

Упрощенный стиль Aero - Windows 7
Раньше Windows 7, находясь в режиме экономии энергии, при переключении на батарею автоматически упрощала Aero, отключая прозрачность и тени...

18
zulkis
682 / 609 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
09.07.2013, 13:35 #2
Я вот что непонимаю:
Вам прошлых мыслей сообщества не хватило по поводу многомерных ваших словарей? А я напомню.
Опять с велосипедом? Прикрутили гудок и трещалку и считаете что это бонус? Упс, нет.

после прочтения становиться ясно что в том виде к каком предикаты существуют в ObjC использовать не вполне удобно.
Кто Вам такое сказал? Мне вот например уже больше 2х лет удобно. А у Вас какой опыт?
На чем основано Ваше суждение? Какие ваши доказательства?(с)

У меня еще один вопрос: На кой черт эти дефайны? Вы где вообще "упрощение" увидели?
Напишите мне предикат сложный с вложенными предикатами используя свое упрощение.
С реальной моделью данных. Сами убедитесь в несостоятельности Ваших предложений.
0
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
09.07.2013, 13:35 #3
Снова здорово. Вместо того, чтобы один общеупотребительный язык изучить, давайте свой какой-нибудь изобретем. Опять обострение?
0
noname_club
103 / 94 / 10
Регистрация: 01.05.2013
Сообщений: 598
09.07.2013, 19:00  [ТС] #4
С реальной моделью данных. Сами убедитесь в несостоятельности Ваших предложений.
реальная модель что должна из себя представлять? многомерный словарь? БД или что?

самую тривиальную задачу со "вложенными" предикатами опишите

Добавлено через 17 минут
На кой черт эти дефайны?
у макросов есть "увидительные" свойства

1) они выделяются коричневым цветом на фоне переменных, что какбы намекает на их постоянство и важность в коде
2) xcode их подсказывает в автодополнении
0
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
09.07.2013, 19:02 #5
Цитата Сообщение от noname_club Посмотреть сообщение
они выделяются коричневым цветом на фоне переменных, что какбы намекает на их постоянство и важность в коде
Согласен. Коричневый цвет - он именно на важность и намекает. На постоянство - в меньшей степени, но вот на важность - несомненно!
0
noname_club
103 / 94 / 10
Регистрация: 01.05.2013
Сообщений: 598
09.07.2013, 19:05  [ТС] #6
сарказм?
0
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
09.07.2013, 19:06 #7
Разумеется
1
Vorona
Peace 2 all shining faces
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,283
10.07.2013, 00:26 #8
Цитата Сообщение от mobidevelop Посмотреть сообщение
Снова здорово. Вместо того, чтобы один общеупотребительный язык изучить, давайте свой какой-нибудь изобретем. Опять обострение?
Серьезно, был же такой изобретатель, вместо NSDictionary советовал использовать макросы dict и все маломальские конструкции на 1 строку оборачивал в макросы, то ли с ооп знаком не был, то ли про методы не слышал или про то, что код должен быть читаемым в первую очередь, а не просто кучей кастомных макросов горе-программиста.

Вы же пишите одноразовые методы, которые можно использовать в очень узких и конкретных целях, зачем выставлять это на показ, мы же все каждый день пишем какие-то методы для упрощения и удобочитаемости своего кода, но с чего вы взяли что они везде и всем подойдут? Это очередная обертка над итак простым существующим инструментом. Зачем мне учить все эти ваши start end fi fs и держать эту кучу мусора в голове, если есть общеизвестный и принятый формат?
0
noname_club
103 / 94 / 10
Регистрация: 01.05.2013
Сообщений: 598
10.07.2013, 09:13  [ТС] #9
мы же все каждый день пишем какие-то методы для упрощения и удобочитаемости своего кода
вот она истина!

получается что ВСЕ повсеместно что то используют, причем об этом никто не говорит, ибо стесняются что не так поймут

но такие инструменты могут называться "быдлокодом" до тех пор, пока на них нет документации, именно это отличает их от стандартных методов!

Подтверждение этому тонны проектов на github, некоторые из них переросли из вот таких маленьких и незаурядных утилит в полноценные инструменты, и ими все пользуются, так как на них есть документация в каком либо виде

----

по прежнему жду пример тривиальной задачи в которой используются вложенные предикаты, для улучшения инструмента
0
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
10.07.2013, 10:50 #10
Уважаемый, неужели вы не видите, что возражения вызывает не само стремление облегчить работу, а исключительно ПУТЬ. Ну не упрощают дефайны жизнь. Особенно окружающим. Поймите, наконец, что скорость РАЗРАБОТКИ очень слабо связана со скоростью НАБОРА текста (или его длиной, что в общем-то одно и то же). Поэтому простым ПЕРЕИМЕНОВАНИЕМ сущностей можно только запутать коллегу, но никак не облегчить себе жизнь. Вы сейчас напоминаете географа, который вместо того, чтобы выучить названия городов слабо знакомой страны, берет карту и поверх старых имен коричневым карандашиком старательно вписывает свои. А вы подумали о тех, кто и без этих нововведений отлично ориентируется по старым именам? Им же придется заново карту учить и к новым именам привыкать. Когда Vorona писал фразу, которую вы процитировали, уверен, он имел в виду совсем не то, что вы. Хотя бы потому, что упомянул удобочитаемость
А вообще, найдите человека по имени alexpac26 и начните с ним какой-нибудь совместный проект. Если это не ваш второй ник, вы с ним сработаетесь. Если это тоже вы, сработаетесь тем более Только не подеритесь если у вас обнаружится 2 разных макроса для обозначения, ну например, NSString.
0
noname_club
103 / 94 / 10
Регистрация: 01.05.2013
Сообщений: 598
10.07.2013, 11:42  [ТС] #11
Поэтому простым ПЕРЕИМЕНОВАНИЕМ сущностей можно только запутать коллегу, но никак не облегчить себе жизнь
mobidevelop, конструктивной критики, без перехода на личности, не будет?

Ну не упрощают дефайны жизнь
а enum и typedef упрощают?

давайте ваще не будем еще ими пользоваться!

---

поставлю вопрос по другому. Очевидно что чтобы например сравнить строку другой строкой на вхожение подстроки без учета регистра требуется написать следущий код:

Objective-C
1
2
3
4
5
    NSString* s = @"Helo world";
    NSPredicate* p = [NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] %@", @"o worl"];
    if ([p evaluateWithObject:s]) {
        // совпадение
    }
требуется одна лишняя строка кода чтобы создать предикат

что если все операции будут сразу в условии?

как лучше это сделать?

так?

Objective-C
1
2
3
4
NSString* s = @"Helo world";
if ([s evaluateString: @"o worl" withPredicate: @"CONTAINS[cd]"]) {
    // совпадение
}
Добавлено через 30 минут
еще такой вариант

Objective-C
1
2
3
if ([s evaluateUsingPredicateWithFormat: @"SELF CONTAINS[cd] %@", @"o worl"]) {
   // совпадение
}
прям высшая степень стандартизации и лаконичности,

- предикат составлен строго по правилами
- название функции использует "стандартные" слова из названий похожих функций
- и самое главное все умещается в одну строку
0
zulkis
682 / 609 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
10.07.2013, 12:28 #12
noname_club, вам уже целая страница конструктива была, это не учитывая прошлую тему про "упрощение обращений к многомерным словарям", а воз и ныне там.
Цитата Сообщение от noname_club Посмотреть сообщение
прям высшая степень стандартизации и лаконичности,
Да, а Ваша выдумка намного удобнее и понятнее, давайте использовать ее и еще 100500 дефайнов в pch файле, ибо не стандарт же, но как же без "упрощения".
Если бы Вы предложили чтото реально стоящее, я первый бы написал что да, это правда круто, и правда стоит использовать.
Однако сейчас я вижу как Вы встали в "позу", и совершенно не прислушиваете к общественности.
Банально, переведите пост и поместите на stackoverflow, gist. Может подержат?
Если да, обещаю вдумчиво все пересмотреть, ознакомится с комментариями я перед Вами извинится за то, что сразу не увидел блестящего решения на мой взгляд несуществующей проблемы.
Но как мне подсказывает здравый смысл - этого(@"Может подержат?") не будет.
0
noname_club
103 / 94 / 10
Регистрация: 01.05.2013
Сообщений: 598
10.07.2013, 12:37  [ТС] #13
Банально, переведите пост и поместите на stackoverflow, gist. Может подержат
мне вашего мнения достаточно для оценки метода работы с предикатами, спасибо.

давайте использовать ее и еще 100500 дефайнов в pch файле
вы так наивно полагаете что в pch файле будет много лишних #define и они будут вводить в заблужение?

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

вообще идея класса с абстрактными инструментами, которые не зависят от типа приложения не нова я думаю и имеет уже некоторые реализации. И как я выше говорил, нужно лишь написать документацию к классу чтобы сделать его понятным для остальных.
0
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
10.07.2013, 13:39 #14
Цитата Сообщение от noname_club Посмотреть сообщение
mobidevelop, конструктивной критики, без перехода на личности, не будет?
А вот сейчас не понял. Неужели в моем сообщении мало конструктива? И где в нем переход на личности? Или я был прав в своем предположении относительно вашего единства в двух лицах и слово "Переименование" вас так задело? Так я имел в виду переименование методов, а не людей
В общем, я бы на вашем месте извинился за необоснованное оскорбление.
0
noname_club
103 / 94 / 10
Регистрация: 01.05.2013
Сообщений: 598
10.07.2013, 13:54  [ТС] #15
Цитата Сообщение от mobidevelop Посмотреть сообщение
Уважаемый, неужели вы не видите, что возражения вызывает не само стремление облегчить работу, а исключительно ПУТЬ. Ну не упрощают дефайны жизнь. Особенно окружающим. Поймите, наконец, что скорость РАЗРАБОТКИ очень слабо связана со скоростью НАБОРА текста (или его длиной, что в общем-то одно и то же). Поэтому простым ПЕРЕИМЕНОВАНИЕМ сущностей можно только запутать коллегу, но никак не облегчить себе жизнь. Вы сейчас напоминаете географа, который вместо того, чтобы выучить названия городов слабо знакомой страны, берет карту и поверх старых имен коричневым карандашиком старательно вписывает свои. А вы подумали о тех, кто и без этих нововведений отлично ориентируется по старым именам? Им же придется заново карту учить и к новым именам привыкать. .....
еще раз
Уважаемый, неужели вы не видите, что возражения вызывает не само стремление облегчить работу, а исключительно ПУТЬ.
1) то есть, идея верная, неверный путь реализации?

Ну не упрощают дефайны жизнь. Особенно окружающим.
2) я так понял все здешние обитатели кроме меня не любят #define и предпочитают запоминать строки и писать @"строка"
тут уж кому как удобно

Поэтому простым ПЕРЕИМЕНОВАНИЕМ сущностей можно только запутать коллегу
3) когда имена переменным придумываете, тоже запутываете коллегу? ибо их имен нет в документации и поэтому никто в них не может логически разобраться?

Вы сейчас напоминаете географа, который вместо того, чтобы выучить названия городов слабо знакомой страны, берет карту и поверх старых имен коричневым карандашиком старательно вписывает свои.
4) неверное сравнение

тут больше подходит проезд в тоннеле под горой, вместо того чтобы лезьть на нее или обходить ее

А вы подумали о тех, кто и без этих нововведений отлично ориентируется по старым именам
это еще не нововведение, вас никто не заставляет переучиваться, просто обсуждаем метод, который возможно будет удобнее, только и всего
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2013, 13:54
Привет! Вот еще темы с ответами:

Упрощенный сниффер 802.11 - C++
Добрый день всем форумчанам. Я нуждаюсь в вашей помощи, как более опытных товарищей, в написании программного кода, функциональность...

Windows 7 - упрощенный стиль - Windows 7
Как изменить цвет панели задач, если стоит тема &quot;Windows 7 - упрощенный стиль&quot;? Нажимаю &quot;Цвет окна&quot; и появляется такое окошко, а дальше...

Как убрать упрощенный стиль?? - Windows 7
Помогите пожалуйста) Установила сестре игрушку, а после автоматически поменялся стиль... как его можно вернуть?

Упрощенный вариант корзины покупателя - Web
Подскажите, кто знает, как сделать очень примитивный вариант корзины покупателя, чтобы при нажатии кнопки &quot;в корзину&quot; название товара само...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
10.07.2013, 13:54
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru