zoukankan      html  css  js  c++  java
  • 如何为Swift进行宏定义

      这阵子一直在自学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的宏定义在本质上并不应该称之为宏定义, 只是为了方便大家的理解, 实质上是一些全局常量和函数, 希望大家不要混淆.

  • 相关阅读:
    web前端的发展态势
    AngularJs 简单入门
    css代码优化篇
    git提交报错:Please make sure you have the correct access rights and the repository exists.
    Activiti工作流框架学习
    遍历map集合的4种方法
    js设置日期、月份增加减少
    Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
    webservice_rest接口_学习笔记
    相互匹配两个list集合+动态匹配${}参数
  • 原文地址:https://www.cnblogs.com/JianweiWang/p/5142306.html
Copyright © 2011-2022 走看看