OC&swift中的宏定义

在Swift与Objective-C混编时,遇到OC宏定义的使用问题。Swift仅能处理定义常量值的宏,其他类型的宏需转换。如:定义常量用`#define`在Swift中可用`let`替代;不变变量值可设为`static let`;变化值需用函数代替,如状态栏高度;带参数的宏需转换为函数调用。解决方法包括:使用`let`、`static let`、定义函数等。
摘要由CSDN通过智能技术生成

在使用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)};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值