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