2010-06-21 3 views
2

Как я могу проверить, что NSRegularExpressionSearch существует до его использования?Проверьте, существует ли перегиб C

enum { 
    NSCaseInsensitiveSearch = 1, 
    NSLiteralSearch = 2, 
    NSBackwardsSearch = 4, 
    NSAnchoredSearch = 8, 
    NSNumericSearch = 64, 
    NSDiacriticInsensitiveSearch = 128, 
    NSWidthInsensitiveSearch = 256, 
    NSForcedOrderingSearch = 512, 
    NSRegularExpressionSearch = 1024 
}; 

Обновление- Я хочу, чтобы скомпилировать против последнего SDK и проверить во время выполнения, если NSRegularExpressionSearch существует.

+2

Означает ли факт, что программа не будет компилироваться без определения? –

+0

Не совсем :) Приложение должно быть совместимо с предыдущими версиями ОС, которые не включают NSRegularExpressionSearch. – christo16

+0

@ christo16: Ну, это не имеет смысла. Либо имя определено (и оно компилируется), либо имя не определено (и оно не компилируется). –

ответ

2

NSRegularExpressionSearch компилируется только тогда, когда

#if __IPHONE_3_2 <= __IPHONE_OS_VERSION_MAX_ALLOWED 

Таким образом, вы должны проверить, что текущая операционная система 3.2 или более поздней версии.

if ([[[UIDevice currentDevice] systemVersion] doubleValue] >= 3.2) {} 

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

if (NSClassFromString(@"UIGestureRecognizer") != nil) {} 
if ([someView respondsToSelector:@selector(gestureRecognizers)]) {} 

В качестве другого примера, посмотрим, как Apple, обрабатывает UI_USER_INTERFACE_IDIOM макрос.

Edit:

Номер версии, чтобы проверить, кроме версии системы NSFoundationVersionNumber.

if (NSFoundationVersionNumber > NSFoundationVersionNumber_iPhoneOS_3_1) {} 

Это более тесно связано с NSString, но нет постоянной для 3.2 в 3.2 заголовках.

+0

Я пытался избежать проверки по версии ОС, поскольку обычно это плохая практика. Но это похоже на единственный способ проверить. – christo16

1

Неправильное название вопроса. Ваш вопрос заключается не в том, существует ли NSRegularExpressionSearch. (Да, он существует во время компиляции с SDK> = 3.2.) Ваш вопрос заключается в том, могут ли методы, подобные rangeOfString:options:, корректно интерпретировать бит опции для регулярного выражения во время выполнения.

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

Мы можем попытаться совпадение с использованием регулярного выражения, которое соответствует строке, но где строка регулярных выражений не существует буквально в строке, так что, если она не понимает параметр регулярного выражения, она будет выполнять буквальное совпадение и не выполнить , Например,

if ([@"b" rangeOfString:@"." options:NSRegularExpressionSearch].location != NSNotFound) { 
    // NSRegularExpressionSearch supported 
} 
Смежные вопросы