在 if/else 语句中使用宏(定义)?没有重新定义的错误

Using a Macro (Define) in an if/else statement ? Without redefined error

我知道这不是一种好的编码方式,但是我正处于制作游戏的过程中,从 Obj-CSwift,但是我正在尝试在我的设备上将其正确设置为 运行,这样我就可以返回并参考所有内容。

所以,这实际上是一个临时措施!我定义了几个宏,

#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 }