在Objective-C中,我们经常使用预处理指令来帮助我们根据不同的平台执行不同的代码,以让我们的代码支持不同的平台,如:

1
2
3
4
5
6
7
8
9
#if TARGET_OS_IPHONE
    #define MAS_VIEW UIView             
#elif TARGET_OS_MAC
    #define MAS_VIEW NSView
#endif

在swift中,由于对C语言支持没有Objective-C来得那么友好(暂时不知swift 2到C的支持如何),所以我们无法像在Objective-C中那样自如而舒坦地使用预处理指令。

不过,swift也提供了自己的方式来支持条件编译,即使用build configurations(构建配置)。Build configurations已经包含了字面量true和false,以及两个平台测试函数os()和arch()。

其中os()用于测试系统类型,可传入的参数包含OSX, iOS, watchOS,所以上面的代码在swift可改成:

1
2
3
4
5
#if os(iOS)
    typealias MAS_VIEW = UIView
#elseif os(OSX)
    typealias MAS_VIEW = NSView
#endif

注:在WWDC 2014的“Sharing code between iOS and OS X”一节(session 233)中,Elizabeth Reid将这种方式称为Shimming

遗憾的是,os()只能检测系统类型,而无法检测系统的版本,所以这些工作只能放在运行时去处理。关于如何检测系统的版本,Mattt Thompson老大在它的Swift System Version Checking一文中给了我们答案。

我们再来看看arch()。arch()用于测试CPU的架构,可传入的值包括x86_64, arm, arm64, i386。需要注意的是arch(arm)对于ARM 64的设备来说,不会返回true。而arch(i386)在32位的iOS模拟器上编译时会返回true。

如果我们想自定义一些在调试期间使用的编译配置选项,则可以使用-D标识来告诉编译器,具体操作是在”Build Setting”–>“Swift Compiler-Custom Flags”–>“Other Swift Flags”–>“Debug”中添加所需要的配置选项。如我们想添加常用的DEGUB选项,则可以在此加上”-D DEBUG”。这样我们就可以在代码中来执行一些debug与release时不同的操作,如

1
2
3
4
5
#if DEBUG
    let totalSeconds = totalMinutes
#else
    let totalSeconds = totalMinutes * 60
#endif

一个简单的条件编译声明如下所示:

1
2
3
4
5
#if build configuration
    statements
#else
    statements
#endif

当然,statements中可以包含0个或多个有效的swift的statements,其中可以包括表达式、语句、和控制流语句。另外,我们也可以使用&&和||操作符来组合多个build configuration,同时,可以使用!操作符来对build configuration取反,如下所示:

1
2
3
4
5
6
7
#if build configuration && !build configuration
    statements
#elseif build configuration
    statements
#else
    statements
#endif

需要注意的是,在swift中,条件编译语句必须在语法上是有效的,因为即使这些代码不会被编译,swift也会对其进行语法检查。

参考

  • Cross-platform Swift

  • Shimming in Swift

  • Swift System Version Checking

  • Interacting with C APIs

Swift中使用构建配置来支持条件编译-b相关推荐

  1. 基于Spring可扩展Schema提供自定义配置支持(spring配置文件中 配置标签支持)

    2019独角兽企业重金招聘Python工程师标准>>> spring使用了这么长时间, 你真的了解spring bean加载的机制吗? 这个是我们项目中最常见的配置文件中的内容配置, ...

  2. apollo源码分析 感知_Kitty中的动态线程池支持Nacos,Apollo多配置中心了

    目录 回顾昨日 nacos 集成 Spring Cloud Alibaba 方式 Nacos Spring Boot 方式 Apollo 集成 自研配置中心对接 无配置中心对接 实现源码分析 兼容 A ...

  3. 如何使用mysql建立项目_【dbForge Studio for MySQL入门教程】如何在项目中使用数据库对象和如何使用项目构建配置...

    重命名数据库对象 要从项目重命名对象,请执行以下步骤: 1. 在" Schema View "窗口中右键单击该对象. 2. 从快捷菜单中选择" Rename " ...

  4. CDH中配置hive支持update delete

    cdh hive支持update delete参数配置方法 以下配置项必须被设定: Client端:hive.support.concurrency – true hive.enforce.bucke ...

  5. Kitty中的动态线程池支持Nacos,Apollo多配置中心了

    目录 回顾昨日 nacos集成 Spring Cloud Alibaba 方式 Nacos Spring Boot 方式 Apollo集成 自研配置中心对接 无配置中心对接 实现源码分析 兼容Apol ...

  6. Swift中依赖注入的解耦策略

    原文地址:Dependency Injection Strategies in Swift 简书地址:Swift中依赖注入的解耦策略 今天我们将深入研究Swift中的依赖注入,这是软件开发中最重要的技 ...

  7. swift视图容器_如何使用IBDesignable在Swift中创建漂亮的,可重复使用的渐变视图...

    swift视图容器 by Lee Dowthwaite 通过李道思韦特 如何使用IBDesignable在Swift中创建漂亮的,可重复使用的渐变视图 (How to create a beautif ...

  8. swift建立桥接_在Swift中建立Alexa技能

    swift建立桥接 by Claus Höfele 通过克劳斯·霍费尔 在Swift中建立Alexa技能 (Building Alexa Skills in Swift) 如何使用Swift开发Ama ...

  9. Swift中的#pragma mark?

    本文翻译自:#pragma mark in Swift? In Objective C, I can use #pragma mark to mark sections of my code in t ...

最新文章

  1. 39.左值、左值引用、右值、右值引用
  2. CSS设置动态超链接
  3. Jenkins怎么安装、使用Jenkins构建、部署spring boot项目
  4. laydate根据开始时间或者结束时间限制范围
  5. 聊一聊开发常用小工具
  6. NGUI使用教程(2) 使用NGUI创建2D场景而且加入标签和button
  7. ECharts4简单入门
  8. Python 密集知识点汇总
  9. 转:HashMap实现原理分析(面试问题:两个hashcode相同 的对象怎么存入hashmap的)...
  10. java编写flash相册的制作软件_flash相册制作大师免费版
  11. 三星android安卓版本怎么升级,大神教你三星S7如何更新安卓7.0 三星S7升级安卓7.0详细教程...
  12. python进行数据抽取_python中的数据抽取
  13. uniapp 实现微信聊天效果 阻止input失焦
  14. Memcached的LRU算法
  15. php 代替each()函数写法
  16. java毕业设计宝马官网Mybatis+系统+数据库+调试部署
  17. 移动互联时代测试工具,互动视频
  18. 你画我猜微信小程序源码
  19. web端 网页端分享功能的实现
  20. python中的int函数是什么意思

热门文章

  1. 2020下半年新机最新消息_2020下半年新机汇总,除了iPhone 12,还有这些旗舰
  2. After Effects 2019 CC for mac下载安装激活步骤演示
  3. ubuntu四个屏幕设置_Linux_从9个方面来立体式地美化Ubuntu 桌面,总结了一下桌面美化的设置。 - phpStudy...
  4. linux安装主从mysql,mysql8.0安装以及主从复制搭建(linux)
  5. mysql using filesort_mysql using filesort Using temporary
  6. python爬音乐评论生成词云图_python爬虫+词云图,爬取网易云音乐评论
  7. Zookeeper分布式一致性原理(九):Zookeeper分布式应用
  8. [ATC 17] StreamBox: 面向多核机器上的针对Records的无序到达的实时流处理系统
  9. 泛珠三角计算机作品大赛2018,2018年泛珠三角大学生计算机作品赛广西赛区选拔赛圆满结束...
  10. win2003服务器的一些安全设置