OC&swift中的宏定义

作者: 移动开发_ziank | 来源:发表于2016-07-08 14:22 被阅读2133次

    在使用OC和swift进行混编时,我们经常会需要在swift中使用OC中的宏定义,但是这些宏定义经常会提示无法找到或者类型错误,那么我们到底应该怎么做才正确呢?

    OC中的宏定义和C一样,主要有以下几种情况:


    OC宏定义
    1. 定义一个常量值,后面可以方便使用;如 #define TOOLBAR_HEIGHT 44
    2. 定义一个不会变化的常用变量值,或者一个较长的对象属性;如#define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)
    3. 定义一个会变化的常用变量值,或者一个较长的对象属性;如:#define STATUS_BAR_HEIGHT ([UIApplication sharedApplication].statusBarFrame.size.height)
    4. 定义一个带参数的宏,类似于一个函数;如#define RGB_COLOR(r,g,b) [UIColor colorWithRed:r/255.f green:g/255.f blue:b/255.f alpha:1.0]

    对于这四种情况,在swift中只能处理第一种情况,而且是直接转换为了let TOOLBAR_HEIGHT = 44;那么由于使用TOOLBAR_HEIGTH的地方基本上都是使用CGFloat,而TOOLBAR_HEIGTH的类型却是Int,就会导致类型不匹配。

    所以我们在混编时对于这些宏定义都需要单独处理:

    swift宏定义处理
    • 第一种的话就比较简单,可以直接使用let TOOLBAR_HEIGTH:CGFloat = 44来替换就可以了;
    • 第二种因为后面的值永远不会改变,也可以使用let来替换;可以用let SCREEN_WIDTH = UIScreen.mainScreen().bounds.size.width
    • 第三种情况,也就是后面的值会发生改变,如状态栏高度,就不能够使用let来替换了,因为let是定义的常量,如果使用let,如果将会导致不能够获取正确的值;这里可以使用函数来获取:func STATUSBAR_HEIGHT() -> CGFloat { return UIApplication.sharedApplication().statusBarFrame.size.height };使用时通过函数STATUSBAR_HEIGTH()获取状态栏高度;
    • 第四种,因为有输入参数,所以也只能使用函数来替换;如:func RGB_COLOR(r:CGFloat, g:CGFloat, b:CGFloat) -> UIColor {return UIColor(red: r, green: g, blue: b, alpha: 1.0)};

    相关文章

      网友评论

      • 拾荒者的世界:第三种情况,对于设备来说只有一种情况吧,是不是可以用 let 直接定义全局常量?
        移动开发_ziank:不一定的,在打电话,或者录音时,设备的状态栏高度和初始值是不同的
      • 判若两人丶:赞一个,

      本文标题:OC&swift中的宏定义

      本文链接:https://www.haomeiwen.com/subject/cpqrjttx.html