这阵子一直在自学Swift, 因为之前iOS的开发一直用Objective-C, 所以习惯了C语言那种宏定义方式, Swift作为一款更加安全的语言, 放弃了C语言中的宏定义, 有效的防止预编译时代码宏替换的安全隐患, 但是也并非不能进行宏定义, 在这里我们可以像java一样进行全局常量的定义, 一样的方便快捷. 简单的宏通过常量设置即可, 复杂的宏就需要使用函数来返回了, 但是使用起来也会很方便, 下面我会分别把OC的宏定义和Swift的全局常量拿出来, 让大家对比比较. 也会详细的介绍新建宏定义的方式

  1, OC宏定义

 

  1.新建文件, 选择iOS -> Source -> Header File

   

demo oc 调用swift swift调用oc宏_demo oc 调用swift

  2.然后随便起个名字就好下一步下一步, 这里就不赘述了.

  生成的文件会是一个空的头文件(Header File)

  

demo oc 调用swift swift调用oc宏_c/c++_02

  3.C语言的宏定义, 并不是很严谨, 任何代码段都可以进行宏定义, 甚至是无效的无序的乱码也可以.

  

demo oc 调用swift swift调用oc宏_移动开发_03

  因为C语言的机制下, 是在编译代码时将宏直接替换成你定义的代码, 所以这在实际使用中, 也是存有安全隐患的

  4.宏定义的使用方法

  首先导入你的头文件, 名字.h即可

  

demo oc 调用swift swift调用oc宏_宏定义_04

[UIScreen mainScreen].bounds.size.width, 所以一般的宏定义函数或者是计算时, 要在外面加括号, 防止一些错误的出现, 而在Swift中, 就不会出现这些安全问题.

  

2, Swift宏定义

  1.新建文件, 选择iOS -> Source -> Swift File

  

demo oc 调用swift swift调用oc宏_移动开发_05

  2.同上, 名字你自己随心意, 毕竟不重要

  生成的会是一个.swift空文件, 默认应该会是Foundation框架, 自己修改为UIKit即可

  

demo oc 调用swift swift调用oc宏_demo oc 调用swift_06

  3.设置宏定义

  首先, 要理解在swift中的宏定义的意义, 在swift中, 并非是预编译代码替换, 而是设置全局常量, 简单宏, 直接let 加常量名即可, 复杂的宏由于必须保证宏的代码的语句的合法性(C语言就不用担心, 合法不合法都会被替换), 所以使用函数进行实现, 下面会举例说明.

  

demo oc 调用swift swift调用oc宏_c/c++_07

  

  但是这种宏定义远远不能满足我们的需要, 如果想要实现上面的那种, 通过对view.X, 获取到view.frame.origin.x的方式, 就要想其他的办法了, 因为直接let x = frame.origin.x这种方式明显不合法

  

demo oc 调用swift swift调用oc宏_swift_08

  这个时候还是想要那种便捷的方式, 就要通过函数来实现了, 把对象作为一个参数, 返回这个控件的具体属性(其实就是对frame的get方法的二次封装, 方便我们的使用), 下面会举例说明, 同样的, 对于其他的宏定义函数, 在这里同样适用, 就不举例了

  

demo oc 调用swift swift调用oc宏_宏定义_09

  4.宏定义的使用

  Swift和java很像, 不同的是java是可以使用, 系统编译时会自动引入需要的类, 而Swift不需要引入, 这些相比OC都方便了很多, 不会出现引入一排头文件很丑陋的样子了, 也避免了很多诸如循环引用的情况(但是也并不是绝对的哦, 所以public class还是有其用武之处的)

  这里我想让我的navView实例能够使用view的frame(很多时候纯代码相对布局的时候, 会用到诸如view.frame.origin.x + view.frame.size.width的情况, 所以这样的宏定义还是很方便的), 示例如下

  

demo oc 调用swift swift调用oc宏_c/c++_10

  其他的一些宏定义, 例如16进制颜色转RGB, 一些对于图片的重绘等方法, 都可以通过全局的宏定义来进行, 这将极大的降低不必要的代码, 实现代码复用, 也节省了开发者的时间, 缩短了开发周期.