1

想知道是否有办法简写这些条件。我正在处理数据包,有时条件会变得有点笨拙。这是一个基本示例:

我写:

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];
}
4

3 回答 3

2

一般来说,没有。这就是 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;
}

该语法是否是一种改进取决于您。

于 2013-02-17T02:11:47.433 回答
1

如果您定义您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 都设置了最低位——并且将它们组合在一起通常会结束仅测试其中一个标志。

于 2013-02-17T18:36:34.610 回答
0

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

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

应该相当于:

if(![@[@(kMessageTypeCutCardsArray),@(kMessageTypeQuit)] 
     contains:@(message->messageType)]) {
于 2013-02-17T06:13:12.060 回答