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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
Objective-C Открыт ли сайт в safari http://www.cyberforum.ru/objective-c/thread919445.html
Добрый день! Можно ли узнать, открыт ли данный сайт в safari (mac os)? Если да, то как?
Objective-C Фейсбук Всем добрый вечер! Я в первый раз работаю с фейсбуком, у меня такой вопрос. Мне нужно проверить, поставил ли пользователь лайк. Нашел такое решение... http://www.cyberforum.ru/objective-c/thread919316.html
Objective-C Ссылка на функцию
Здравствуйте уважаемые Форумчане! Пожалуйста подскажите начинающему Objective c разработчику, возможно ли реализация ссылки на функцию в этом языке (или что то схожее с делегатами из C#). Облазил...
Приложение засыпает при загрузке Objective-C
Всем добрый день. Приложение засыпает (не крешится), когда идет долгая загрузка. Поставил setIdleTimerDisabled:YES], не помогло. Вот видео http://files.mail.ru/B90AFF82013D488CAF96D842043CC20A. В...
Objective-C дебаггинг http://www.cyberforum.ru/objective-c/thread915695.html
Добрый день! Возникла такие ошибка, как в скриншоте. Можно ли найти строчку, в которой возникла ошибка? Если да ,то как?
Objective-C Приложение падает при многократной загрузке фото/видео Привет. сделал 2 класса которое выводит на монитор видео(с помощью mplayer) и "фотошоу"(на nswindow), работают нормально. но если много кратно запускать, то видео то фото падает... подробнее

Показать сообщение отдельно
noname_club
104 / 95 / 11
Регистрация: 01.05.2013
Сообщений: 600

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

09.07.2013, 12:58. Просмотров 2213. Ответов 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 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.