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

  1, OC宏定义

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

   

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

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

  

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

  

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

  4.宏定义的使用方法

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

  

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

  

  2, Swift宏定义

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

  

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

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

  

  3.设置宏定义

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

    

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

  

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

  

  4.宏定义的使用

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

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

  

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

  Swift的宏定义在本质上并不应该称之为宏定义, 只是为了方便大家的理解, 实质上是一些全局常量和函数, 希望大家不要混淆.

转载于:https://www.cnblogs.com/JianweiWang/p/5142306.html

如何为Swift进行宏定义相关推荐

  1. iOS常用宏定义大全

    宏定义与常量的区别 宏:只是在预处理器里进行文本替换,不做任何类型检查,宏能定义代码,const不能,多个宏编译时间相对较长,影响开发效率,调试过慢,const只会编译一次,缩短编译时间. 所以在使用 ...

  2. Flutter iOS问题记录 - 多环境配置下Pod库的宏定义失效

    文章目录 前言 开发环境 问题描述 问题分析 1. 创建用于测试的Pod库 2. 验证问题是否只存在于Pod库 3. __OPTIMIZE__在什么时候会定义 4. 影响__OPTIMIZE__定义的 ...

  3. C++ #define(宏定义)的使用

    C++ 宏定义 #define命令是C++语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本. 宏定义的一般形式 #define <宏名& ...

  4. 如何用C语言改变宏定义的大小,C语言中宏定义使用的小细节

    C语言中宏定义使用的小细节 #pragma#pragma 预处理指令详解 在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#p ...

  5. c 宏定义用法#define

    转自:https://blog.csdn.net/boring_wednesday/article/details/78756696 宏定义 语法     #define name Stuff #de ...

  6. C语言宏定义使用技巧

    写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性等等.下面列举一些成熟软件中常用得宏定义...... 1,防止一个头文件被重复包含 #ifndef COMDEF_H ...

  7. 【C语言】07-预处理指令;-宏定义

    预处理指令简介; 1,C在对源程序进行编译之前,会对一些特殊的预处理指令作解释,产生一个新的源程序,此过程叫做编译预处理.C在经过编译预处理之后才对新的源码进行通常的编译; 2,预处理以'#'开头,且 ...

  8. 巧用宏定义进行调试 (转)

    巧用宏定义进行调试 在进行程序设计时,有时我们往往不希望借住于调试工具(如:gdb, vc),而以输出调试信息的方式进行调试时,我们就可以借住于强大的宏定义来进行调试.    一.在GCC下的定义方法 ...

  9. python用海伦公式求面积_用带参数的宏定义,通过海伦公式求三角形的面积

    要求: 海伦公式: ,其中 ,a,b,c为三角形的三个边.定义两个带参数的宏,一个用来求p,另一个用来求s 题目分析: 首先,题目要求是通过输入三角形的三条边,输出三角形的面积.因为不是任意的三条边都 ...

最新文章

  1. 比较好的电脑系统_win10电脑系统选择什么版本比较好
  2. 网站后台管理界面设计的一些想法
  3. 单词缩写(abbr.cpp)每日一题
  4. 使用JDBC操作数据库时,如何提升读取数据的性能?如何提升更新数据的性能?...
  5. 单元测试Struts2Spring项目的Action和Service(包含源码)
  6. 苹果再次拒绝协助美国政府解锁纽约毒品案中的iPhone
  7. 理解Synchronized
  8. 嵌入式Linux要学哪些东西?你真的造吗?
  9. 人工智能_TensorFlow工作笔记003---在pycharm中安装TensorFlow
  10. 【白皮书分享】2020-2021年运营从业者薪资及职业现状调查白皮书.pdf(附下载链接)...
  11. 让Visual Studio 2008 和 2010支持Web Services Enhancements (WSE) 3.0
  12. 自动写代码工具要颠覆码农?(转)
  13. 企业思想家:专家详解元宇宙逻辑和产业机会 (5000余字)
  14. D3D9学习笔记之颜色
  15. Jmockit使用笔记_基本功能使用@Tested_@Injectable_@Mocked_Expectations
  16. 国家认证的Python技术工程师有什么能力要求?
  17. word表格跨页显示时缺少上框线
  18. 【超好玩的路由环路系列】2——汇总环路
  19. win10怎么更改账户名称_如何更改电脑系统账户名称?让你的名称看起来高大上,快来学习吧...
  20. 《Domain Agnostic Learning with Disentangled Representations》代码

热门文章

  1. 清晨一杯水,到底怎么喝才算健康?
  2. 有时候能讲出来,比沉默要好吧
  3. 决定创业失败的除了团队外
  4. ufs3.0和ufs2.1的区别体现在哪些方面?
  5. java异常代码_Java异常(示例代码)
  6. SQL Server报表生成器中的R脚本词云
  7. SQL Server 2014中的混合云和Hekaton功能
  8. 程序迭代时测试操作的要点(后端前端)
  9. Thinkphp3.2.3的主从分离事务问题(坑!!!)
  10. 剑指Offer_12_矩阵中的路径(参考问题:马踏棋盘)