2013-01-01 84 views
0

我正在研究可可Mac OS X應用程序,該應用程序爲NSRegularExpression搜索提供了一系列選項。這些選項都表示,像這樣的枚舉:動態生成一個枚舉參數?

enum { 
NSRegularExpressionCaseInsensitive    = 1 << 0, 
NSRegularExpressionAllowCommentsAndWhitespace = 1 << 1, 
NSRegularExpressionIgnoreMetacharacters  = 1 << 2, 
NSRegularExpressionDotMatchesLineSeparators = 1 << 3, 
NSRegularExpressionAnchorsMatchLines   = 1 << 4, 
NSRegularExpressionUseUnixLineSeparators  = 1 << 5, 
NSRegularExpressionUseUnicodeWordBoundaries = 1 << 6 
}; 
typedef NSUInteger NSRegularExpressionOptions; 

我想有用戶從任何一個選項(這是一個系列的複選框)選擇,然後將結果傳遞給方法regularExpressionWithPattern:選擇:錯誤:。我以整數的形式接收這些選項,例如,用戶可能會選擇0和5。

我找不出什麼合適的技術在這裏。 選項參數是一個帶有按位或運算符的整數,但是如何根據用戶在這些複選框中的選擇動態構建它,以便我可以將它傳遞給該方法調用?

這裏有一個天真的和不正確的嘗試:

for (NSButtonCell * cell in [sender selectedCells]) { 
    NSNumber * tag = [NSNumber numberWithInteger:[cell tag] - 1]; 
    [self.optionsString stringByAppendingString:[NSString stringWithFormat:@"%@|", [tag stringValue]]]; 
} 

顯然,選項並不需要一個NSString。但我希望這能夠澄清我在做什麼,這樣你就明白了這個問題!

回答

4

您只需按位或所選選項。 |=操作員可讓您簡單地完成此操作。

如果你的細胞通過6標記0:

NSUInteger options = 0; 
for (NSButtonCell * cell in [sender selectedCells]) 
    options |= (1 << [cell tag]); 

我不明白爲什麼你在你的示例代碼減去[cell tag]之一。

+0

懶惰:我給以1開頭的選項做了標記。:-) –

+1

方便的是,有一個'| ='運算符,在表達式中爲您節省了單詞'options'的一個實例。 –

+0

謝謝。我在那工作。 – paulmelnikow

1

如果您使用位的int值。 (即1,2,4,8等)

你可以按原樣使用它們作爲True選擇。

NSRegularExpressionOptions selectedOptions = 0; 
for (NSButtonCell * cell in [sender selectedCells]) { 
    selectedOptions = selectedOptions | tag.unsignedIntegerValue; 
} 

因爲這些值是標誌,所以可以使用按位或(|)導致任一值中的任何標誌都已打開。

只要確保將標記設置爲要使用的整型值即可。 (即1,2,4,8,16,32和64)

或者你可以把它們加起來。

它們的位值如下。

enum { 
    NSRegularExpressionCaseInsensitive    = 1 << 0, 
    NSRegularExpressionAllowCommentsAndWhitespace = 1 << 1, 
    NSRegularExpressionIgnoreMetacharacters  = 1 << 2, 
    NSRegularExpressionDotMatchesLineSeparators = 1 << 3, 
    NSRegularExpressionAnchorsMatchLines   = 1 << 4, 
    NSRegularExpressionUseUnixLineSeparators  = 1 << 5, 
    NSRegularExpressionUseUnicodeWordBoundaries = 1 << 6 
}; 

    NSRegularExpressionCaseInsensitive    == 0b00000001; // (1) 
    NSRegularExpressionAllowCommentsAndWhitespace == 0b00000010; // (2) 
    NSRegularExpressionIgnoreMetacharacters  == 0b00000100; // (4) 
    NSRegularExpressionDotMatchesLineSeparators == 0b00001000; // (8) 
    NSRegularExpressionAnchorsMatchLines   == 0b00010000; // (16) 
    NSRegularExpressionUseUnixLineSeparators  == 0b00100000; // (32) 
    NSRegularExpressionUseUnicodeWordBoundaries == 0b01000000; // (64) 

其值均通過等價「按位或(|)」以及另外

Via Addition   NSUInteger value = 2 + 4; 
    or bitwise or (|)  NSUInteger value = 2 | 4; 
    Even with Bitshifting NSUInteger value = (1 << 1) + (1 << 2); 
          NSUInteger value = (1 << 1) | (1 << 2); 

    0b00000010 (2) 
    +0b00000100 +(4) 
    ----------- --- 
    0b00000110 (6) 

其中按位或派上用場的開啓標誌。

 (addition) 
    0b00000010 (2) 
    +0b00000110 +(6) 
    ----------- --- 
    0b00001000 (8) 



     (bitwise or) 
    0b00000010 (2) 
    |0b00000110 |(6) 
    ----------- --- 
    0b00000110 (6) 

因爲或只打開「Both」值中的標誌。你從一開始就得到同樣的東西。

更復雜的例子就是這個。

 (bitwise or) 
    0b00010010 (18) 
    |0b00000110 |(6) 
    ----------- --- 
    0b00010110 (22) 


     (addition) 
    0b00010010 (18) 
    +0b00000110 +(6) 
    ----------- --- 
    0b00011000 (24) 

正如你所看到的。他們有不同的目的。而且區別的知識很重要。