2010-06-21 118 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

如果沒有定義幫助,程序將無法編譯這個事實嗎? – 2010-06-21 23:57:45

+0

不是真的:)該應用程序需要與不包含NSRegularExpressionSearch的先前版本的操作系統兼容。 – christo16 2010-06-22 00:04:30

+0

@ christo16:那麼,這是沒有意義的。名稱被定義(並且它被編譯)或名稱是未定義的(並且它不編譯)。 – 2010-06-22 02:51:32

回答

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)]) {} 

再比如,看到蘋果如何處理UI_USER_INTERFACE_IDIOM宏。

編輯:

版本號來檢查,除了系統版本NSFoundationVersionNumber

if (NSFoundationVersionNumber > NSFoundationVersionNumber_iPhoneOS_3_1) {} 

是更緊密地聯繫在一起的NSString,但在3.2頭3.2沒有固定。

+0

我試圖避免通過操作系統版本檢查,因爲這通常是一個不好的做法。但它看起來是檢查的唯一方法。 – christo16 2010-06-22 15:30:35

1

問題標題不正確。你的問題不是NSRegularExpressionSearch是否存在。 (是的,它在編譯時存在,使用SDK> = 3.2。)您的問題是像rangeOfString:options:這樣的方法是否可以在運行時正確解釋正則表達式的選項位。

由於這純粹是關於函數行爲的問題,因此弄明白的一個顯而易見的方法就是做一個實驗。做一些你知道會在有支持時會成功,但如果沒有支持就會失敗。

我們可以使用匹配字符串的正則表達式嘗試匹配,但是正則表達式字符串在字符串中並不存在,因此如果它不理解正則表達式選項,它將執行文字匹配並失敗。例如,

if ([@"b" rangeOfString:@"." options:NSRegularExpressionSearch].location != NSNotFound) { 
    // NSRegularExpressionSearch supported 
}