目标c-是否可以缩短可可中的条件语句以不重新声明变量名



想知道是否有一种方法可以简写这些条件。我正在处理数据包,条件语句有时会变得有点笨拙。这里有一个基本的例子:

我写:

if (message->messageType != kMessageTypeCutCardsArray && message->messageType != kMessageTypeQuit) {
    MessageInt message;
    message.message.messageType = kMessageTypeReceivedData;
    NSData *packet = [NSData dataWithBytes:&message length:sizeof(message)];
    [_game sendData:packet];
}

我宁愿写:

if (message->messageType != (kMessageTypeCutCardsArray || kMessageTypeQuit)) {
    MessageInt message;
    message.message.messageType = kMessageTypeReceivedData;
    NSData *packet = [NSData dataWithBytes:&message length:sizeof(message)];
    [_game sendData:packet];
}

一般来说,没有。这只是C(以及Objective-C)的工作方式。

在这种特定情况下,您可以使用switch语句:

switch (message->messageType)
{
    case kMessageTypeCutCardsArray:
    case kMessageTypeQuit:
        break;
    default:
        MessageInt message;
        message.message.messageType = kMessageTypeReceivedData;
        NSData *packet = [NSData dataWithBytes:&message length:sizeof(message)];
        [_game sendData:packet];
        break;
}

这种语法是否有改进取决于您。

如果您定义enum,使值具有互斥的位模式,如:

typedef enum : NSUInteger {
    kMessageTypeLoveLetter = 1 << 0,
    kMessageTypeBirthdayCard = 1 << 1,
    kMessageTypeVacationPostcard = 1 << 2,
    kMessageTypeCreditApplication = 1 << 3,
    kMessageTypeCharitySolicitation = 1 << 4
} MessageType;

然后,您可以使用二进制OR |和二进制and &:同时测试多个值

MessageType msgType = kMessageTypeCreditApplication;
if( !(msgType & (kMessageTypeLoveLetter | kMessageTypeBirthdayCard)) ){
    // Nobody loves you.
}
if( (msgType & (kMessageTypeCreditApplication | kMessageTypeCharitySolicitation) ){
    // Someone wants your money.
}

然而,如果使用编译器为enum生成的连续值,这将不起作用,因为这些值将作为标志重叠——例如,2和3都具有最低位集——并且将它们一起进行"或"运算通常只测试其中一个标志。

您可以将值框起来并使用临时数组。这实现了在条件中消除重复的目标,但不太可能对编译器进行优化。

if (message->messageType != kMessageTypeCutCardsArray && 
    message->messageType != kMessageTypeQuit) {

应等同于:

if(![@[@(kMessageTypeCutCardsArray),@(kMessageTypeQuit)] 
     contains:@(message->messageType)]) {

相关内容

  • 没有找到相关文章

最新更新