如何将#define放在if语句中 - Objective-C

Sha*_*hah 0 iphone cocoa-touch objective-c cocos2d-iphone

我正在制作一个iPhone应用程序,我想做宽屏检测,所以我做了一堆,#define我想用它做一个if语句.

// Device and Widescreen Detection
#define IS_WIDESCREEN ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )

// iPhone
#define IS_IPHONE ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPhone" ] )  || ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPhone Simulator" ] ) )
#define IS_IPHONE_5 ( IS_IPHONE && IS_WIDESCREEN )

// iPod Touch
#define IS_IPOD   ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPod touch" ] )
#define IS_IPOD_5 ( IS_IPOD && IS_WIDESCREEN )

// iPad
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
Run Code Online (Sandbox Code Playgroud)

我想做一个if声明说

if (IS_IPHONE_5) {
...
} else {
...
}
Run Code Online (Sandbox Code Playgroud)

问题是if语句返回错误,XCode一直告诉我这样做

if (IS_IPHONE_5 {
...
} else {
...
}
Run Code Online (Sandbox Code Playgroud)

或这个

if IS_IPHONE_5 {
...
} else {
...
}
Run Code Online (Sandbox Code Playgroud)

否则会出错.这是写这个的正确方法吗?

Jac*_*ack 14

您在IS_IPHONE宏定义中缺少括号.你有:

( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPhone" ] )  || ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPhone Simulator" ] ) )
Run Code Online (Sandbox Code Playgroud)

但你应该:

( ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPhone" ] )  || ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPhone Simulator" ] ) )
Run Code Online (Sandbox Code Playgroud)

要找到这些类型的错误,您可以轻松使用菜单Product - > Generate Output - > Preprocessed File中的命令.通过这种方式,您的预处理器宏将被扩展,您将能够看到最终代码,因此错误在哪里.

在此输入图像描述