2012-02-19 222 views
1

我不是很好用的術語..下面的代碼,我有:嘗試使用NSUInteger與枚舉(<<)

enum { 
    LoggerLogNone  = 0, 
    LoggerLogMessages = 1 << 0, 
    LoggerLogErrors  = 1 << 1 
}; 
typedef NSUInteger LoggerLogs; 

而我想要做的是使用LoggerLogs我邏輯確定是否應該記錄。所以在我的log:(NSString *)message我希望它僅記錄如果用戶設置LoggerLogMessages,併爲logError:(NSString *)error我希望它僅記錄如果用戶設置LoggerLogErrors .. 我知道如何設置:

LoggerLogs logs = LoggerLogMessages | LoggerLogErrors; 

什麼我不不知道該怎麼做是檢查是否檢測到LoggerLogMessagesLoggerLogErrors。 任何幫助將不勝感激。我敢肯定,這是什麼地方在這裏得到解答,但因爲我不知道該條款才能使用,這真的很難搜索> _ <

回答

2
- (void)log:(NSString *)message { 
    if (logs & LoggerLogMessages) { 
     NSLog(@"message: %@", message); 
    } 
} 

- (void)logError:(NSString *)error { 
    if (logs & LoggerLogErrors) { 
     NSLog(@"error: %@", error); 
    } 
} 

兩個<<&被稱爲位運算符。如果你的谷歌bitwise operators C,你會發現很多解釋。

+0

謝謝一堆:-D它的工作原理。我應該知道這一點..當談到術語時,我剛剛得到了最糟糕的記憶。 – 2012-02-21 19:39:43

0

如果要檢查,如果你想記錄的錯誤消息

if(logFlags & LoggerLogErrors) 
    //log the message 

你也應該記錄消息,利用位與

if(logFlags & LoggerLogMessages) 
    //log the message 

同樣,對於這些常用的術語是bit fieldsflags

1

您正在尋找按位AND運算符&

if (logs & LoggerLogMessages) { 
    ... 
} 

if (logs & LoggerLogErrors) { 
    ... 
} 
1

要檢查是否設置一個標誌,你只是簡單地執行與變量存儲了標誌的標誌一個位與&)被檢查,其結果將是被檢查在標誌該位序列包含在變量中:

if ((logs & LoggerLogMessages) == LoggerLogMessages) { 
    // LoggerLogMessages is set 
} 

或者你可能僅僅只是有:

if (logs & LoggerLogMessages) { ... } 
0

我想你想一個邏輯或按位ANDS,如:

if ((flag & LoggerLogMessages) || (flag & LoggerLogErrors)) 

意識到的另一件事是你所關心的兩個國家是僅有的兩個和兩個> 0,所以

if (flag) 

也可以工作。

+1

'typedef'沒有*在*'enum'之前。 – 2012-02-19 05:56:01

+0

在你的編譯器中試一下。如果他想像使用類型那樣使用它,它需要一個typedef。 – danh 2012-02-19 06:07:09

+1

@danh:不,OP是這麼做的[Apple推薦的方式](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Cocoa64BitGuide/64BitChangesCocoa/64BitChangesCocoa.html#//apple_ref/doc/UID/TP40004247-CH4-SW8)。 – 2012-02-19 06:49:15

相關問題