Попытка использовать NSUInteger с перечислением (<<) - PullRequest
1 голос
/ 19 февраля 2012

Я не очень хорошо разбираюсь в терминологии .. вот код, который у меня есть:

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;

Чего я не знаю, так это проверить, установлен ли флажок LoggerLogMessages или LoggerLogErrors. Любая помощь будет принята с благодарностью. Я уверен, что где-то здесь есть ответ, но так как я не знаю, какие термины использовать, действительно сложно найти> _ <</p>

Ответы [ 5 ]

2 голосов
/ 19 февраля 2012
- (void)log:(NSString *)message {
    if (logs & LoggerLogMessages) {
        NSLog(@"message: %@", message);
    }
}

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

И <<, и & называются побитовыми операторами . Если вы Google bitwise operators C, вы найдете множество объяснений.

1 голос
/ 19 февраля 2012

Чтобы проверить, установлен ли флаг, вы просто выполняете побитовое И (&) с переменной, хранящей флаги с проверяемым флагом, в результате будет полученпроверяется, содержится ли эта битовая последовательность в переменной:

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

Или вы просто можете иметь:

if (logs & LoggerLogMessages) { ... }
1 голос
/ 19 февраля 2012

Вы ищете побитовый оператор AND, &.

if (logs & LoggerLogMessages) {
  ...
}

if (logs & LoggerLogErrors) {
  ...
}
0 голосов
/ 19 февраля 2012

Я думаю, вам нужны логические или побитовые, например:

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

Еще одна вещь, которую нужно понять, это то, что два состояния, о которых вы заботитесь, - это только два, и оба> 0, поэтому

if (flag)

тоже будет работать.

0 голосов
/ 19 февраля 2012

Если вы хотите проверить, должны ли вы регистрировать сообщения, используйте побитовое И

if(logFlags & LoggerLogMessages)
    //log the message

Аналогично, если вы хотите регистрировать сообщения об ошибках

if(logFlags & LoggerLogErrors)
    //log the message

Кроме того, общий термин для этих сообщений битовые поля или флаги

...