在 if/else 语句中使用宏(定义)?没有重新定义的错误
Using a Macro (Define) in an if/else statement ? Without redefined error
我知道这不是一种好的编码方式,但是我正处于制作游戏的过程中,从 Obj-C
到 Swift
,但是我正在尝试在我的设备上将其正确设置为 运行,这样我就可以返回并参考所有内容。
所以,这实际上是一个临时措施!我定义了几个宏,
#define BTNNUMBER_W 60
#define BTNNUMBER_H 60
它们在代码中被引用,在一个我真的不能拆分 if/else 语句的区域,所以想有效地调试使用;
if(IS_IPHONE_OLD)
{
#define BTNNUMBER_W 60
#define BTNNUMBER_H 60
}
else if (IS_IPHONE_5)
{
#define BTNNUMBER_W 60
#define BTNNUMBER_H 60
}
else if (IS_IPHONE_6_6S_6P_6SP_7_8)
{
#define BTNNUMBER_W 30
#define BTNNUMBER_H 30
NSLog(@"iPhone 6 to 8");
}
else if (IS_IPHONE_7P_8P)
{
#define BTNNUMBER_W 60
#define BTNNUMBER_H 60
NSLog(@"iPhone 7P to 8P");
}
else if (IS_IPHONE_X)
{
#define BTNNUMBER_W 110
#define BTNNUMBER_H 110
}
如前所述,这真的只是再次'get it working',虽然我重新做了这一切,但任何指示都非常有必要!
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IDIOM UI_USER_INTERFACE_IDIOM()
#define IPAD UIUserInterfaceIdiomPad
#define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)
#define SCREEN_HEIGHT ([[UIScreen mainScreen] bounds].size.height)
#define SCREEN_MAX_LENGTH (MAX(SCREEN_WIDTH, SCREEN_HEIGHT))
#define SCREEN_MIN_LENGTH (MIN(SCREEN_WIDTH, SCREEN_HEIGHT))
#define IS_IPHONE_OLD (IS_IPHONE && SCREEN_MAX_LENGTH == 480.0)
#define IS_IPHONE_5 (IS_IPHONE && SCREEN_MAX_LENGTH == 568.0)
#define IS_IPHONE_6_6S_6P_6SP_7_8 (IS_IPHONE && SCREEN_MAX_LENGTH == 667.0)
#define IS_IPHONE_7P_8P (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0)
#define IS_IPHONE_X (IS_IPHONE && SCREEN_MAX_LENGTH == 812.0)
在 C 和 Objective-C 中,使用预处理器的 #if
而不是编程语言的 if
:
#if IS_IPHONE_OLD || IS_IPHONE_5
#define BTNNUMBER_W 60
#define BTNNUMBER_H 60
#elif IS_IPHONE_6_6S_6P_6SP_7_8
#define BTNNUMBER_W 30
#define BTNNUMBER_H 30
// …
#endif
但是这将不起作用因为你的IS_IPHONE_OLD
等不是编译时常量(它们也不可能是,因为同一个应用程序可以是运行 在多部手机上)。预处理器进行简单的文本替换,所有这些都发生在 before 任何代码甚至被解析(因此 pre-processor) .
你不能在运行时影响预处理器宏,但你只能在运行时知道屏幕尺寸…
相反,将您的宏切换为同名变量:
CGFloat BTNNUMBER_W;
CGFloat BTNNUMBER_H;
然后在使用它们之前运行的某个函数中,分配它们的值:
if (IS_IPHONE_OLD || IS_IPHONE_5) {
BTNNUMBER_W = 60;
BTNNUMBER_H = 60;
} // …
或者,将您的变量命名为更好的名称,然后:
#define BTNNUMBER_W ([[AppDelegate instance] buttonNumberWidth])
在 Swift 中,使用计算属性:
static var buttonNumberWidth: CGFloat {
let screenWidth = UIScreen.main.bounds.size.width
if screenWidth <= 480 {
return 30
} // …
}
static var buttonNumberHeight: CGFloat { buttonNumberWidth }
我知道这不是一种好的编码方式,但是我正处于制作游戏的过程中,从 Obj-C
到 Swift
,但是我正在尝试在我的设备上将其正确设置为 运行,这样我就可以返回并参考所有内容。
所以,这实际上是一个临时措施!我定义了几个宏,
#define BTNNUMBER_W 60
#define BTNNUMBER_H 60
它们在代码中被引用,在一个我真的不能拆分 if/else 语句的区域,所以想有效地调试使用;
if(IS_IPHONE_OLD)
{
#define BTNNUMBER_W 60
#define BTNNUMBER_H 60
}
else if (IS_IPHONE_5)
{
#define BTNNUMBER_W 60
#define BTNNUMBER_H 60
}
else if (IS_IPHONE_6_6S_6P_6SP_7_8)
{
#define BTNNUMBER_W 30
#define BTNNUMBER_H 30
NSLog(@"iPhone 6 to 8");
}
else if (IS_IPHONE_7P_8P)
{
#define BTNNUMBER_W 60
#define BTNNUMBER_H 60
NSLog(@"iPhone 7P to 8P");
}
else if (IS_IPHONE_X)
{
#define BTNNUMBER_W 110
#define BTNNUMBER_H 110
}
如前所述,这真的只是再次'get it working',虽然我重新做了这一切,但任何指示都非常有必要!
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IDIOM UI_USER_INTERFACE_IDIOM()
#define IPAD UIUserInterfaceIdiomPad
#define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)
#define SCREEN_HEIGHT ([[UIScreen mainScreen] bounds].size.height)
#define SCREEN_MAX_LENGTH (MAX(SCREEN_WIDTH, SCREEN_HEIGHT))
#define SCREEN_MIN_LENGTH (MIN(SCREEN_WIDTH, SCREEN_HEIGHT))
#define IS_IPHONE_OLD (IS_IPHONE && SCREEN_MAX_LENGTH == 480.0)
#define IS_IPHONE_5 (IS_IPHONE && SCREEN_MAX_LENGTH == 568.0)
#define IS_IPHONE_6_6S_6P_6SP_7_8 (IS_IPHONE && SCREEN_MAX_LENGTH == 667.0)
#define IS_IPHONE_7P_8P (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0)
#define IS_IPHONE_X (IS_IPHONE && SCREEN_MAX_LENGTH == 812.0)
在 C 和 Objective-C 中,使用预处理器的 #if
而不是编程语言的 if
:
#if IS_IPHONE_OLD || IS_IPHONE_5
#define BTNNUMBER_W 60
#define BTNNUMBER_H 60
#elif IS_IPHONE_6_6S_6P_6SP_7_8
#define BTNNUMBER_W 30
#define BTNNUMBER_H 30
// …
#endif
但是这将不起作用因为你的IS_IPHONE_OLD
等不是编译时常量(它们也不可能是,因为同一个应用程序可以是运行 在多部手机上)。预处理器进行简单的文本替换,所有这些都发生在 before 任何代码甚至被解析(因此 pre-processor) .
你不能在运行时影响预处理器宏,但你只能在运行时知道屏幕尺寸…
相反,将您的宏切换为同名变量:
CGFloat BTNNUMBER_W;
CGFloat BTNNUMBER_H;
然后在使用它们之前运行的某个函数中,分配它们的值:
if (IS_IPHONE_OLD || IS_IPHONE_5) {
BTNNUMBER_W = 60;
BTNNUMBER_H = 60;
} // …
或者,将您的变量命名为更好的名称,然后:
#define BTNNUMBER_W ([[AppDelegate instance] buttonNumberWidth])
在 Swift 中,使用计算属性:
static var buttonNumberWidth: CGFloat {
let screenWidth = UIScreen.main.bounds.size.width
if screenWidth <= 480 {
return 30
} // …
}
static var buttonNumberHeight: CGFloat { buttonNumberWidth }