Swift中的Build Configurations

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

Build Configurations in Swift

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

  1. #if TARGET_OS_IPHONE 
  2.  
  3. #define MAS_VIEW UIView 
  4.  
  5. #elif TARGET_OS_MAC 
  6.  
  7. #define MAS_VIEW NSView 
  8.  
  9. #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. #if os(iOS) 
  2. typealias MAS_VIEW = UIView 
  3. #elseif os(OSX) 
  4. typealias MAS_VIEW = NSView 
  5. #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. #if DEBUG 
  2. let totalSeconds = totalMinutes 
  3. #else 
  4. let totalSeconds = totalMinutes * 60 
  5. #endif 
  6.  
  7. 一个简单的条件编译声明如下所示: 
  8.  
  9. #if build configuration 
  10. statements 
  11. #else 
  12. statements 
  13. #endif 

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

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

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

责任编辑:chenqingxiang 来源: 南峰子的技术博客
相关推荐

2015-01-21 16:25:29

Swift指针

2015-03-16 10:33:14

Swift指针

2015-11-23 10:07:19

Swift模式匹配

2022-05-11 09:01:54

Swift类型系统幻象类型

2022-07-04 08:54:39

Swift处理器项目

2022-05-25 09:15:01

Swift 5.6占位符

2021-07-07 11:41:38

Swift key paths

2022-06-13 09:02:06

Swift类型占位符

2009-03-09 18:39:56

Windows 7新特性

2023-11-03 11:56:34

2022-11-21 09:01:00

Swift并发结构

2015-10-13 10:00:58

Swift随机数使用总结

2022-04-06 09:10:03

抽象类型普通类型Swift

2014-07-04 09:47:24

SwiftSwift开发

2021-09-03 08:57:59

Swift强制解析

2010-08-26 16:16:17

DHCP服务器

2015-07-08 10:47:57

Using Swift CocoaObjective-C

2016-02-23 09:23:50

swift陷阱解决方法

2014-08-14 10:12:45

SwiftNil Coalesc

2021-04-20 06:12:09

Swift 反射 Mirror反射机制
点赞
收藏

51CTO技术栈公众号