在使用OC和swift进行混编时,我们经常会需要在swift中使用OC中的宏定义,但是这些宏定义经常会提示无法找到或者类型错误,那么我们到底应该怎么做才正确呢?
OC中的宏定义和C一样,主要有以下几种情况:
- 定义一个常量值,后面可以方便使用;如
#define TOOLBAR_HEIGHT 44
; - 定义一个不会变化的常用变量值,或者一个较长的对象属性;如
#define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)
; - 定义一个会变化的常用变量值,或者一个较长的对象属性;如:
#define STATUS_BAR_HEIGHT ([UIApplication sharedApplication].statusBarFrame.size.height)
; - 定义一个带参数的宏,类似于一个函数;如
#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,就会导致类型不匹配。
所以我们在混编时对于这些宏定义都需要单独处理:
- 第一种的话就比较简单,可以直接使用
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)}
;