首页 > 解决方案 > 在 if/else 语句中使用宏(定义)?没有重新定义的错误

问题描述

我知道这不是一种好的编码方式,但是我只是在制作我正在开发的游戏的过程中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
    }

正如已经说过的,这实际上只是为了再次“让它工作”,而我重新做这一切,但任何指针都会非常有义务!

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

标签: iosobjective-c

解决方案


在 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_OLDetc. 不是编译时常量(也不能,因为同一个应用程序可以在多部手机上运行)。预处理器进行简单的文本替换,所有这些都发生任何代码甚至被解析之前(因此是处理器)。

不能在运行时影响预处理器宏,但你只能在运行时知道屏幕大小……</p>

相反,将您的宏切换为同名的变量:

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 }

推荐阅读