了解iOS系统的人都知道,iOS开发有两种基础语言,一种是沿用已久的Objective-C,一种是新出的Swift。
姜还是老的辣,这话还是有一定的道理的,在使用swift1.0对iOS开发中,由于其对C语言支持没有Objective-C来得那么友好,所以无法像在Objective-C中那样自如而舒坦地使用预处理指令。
AD:
BuildConfigurations in Swift
在使用Objective-C进行开发中,我们经常使用预处理指令来帮助我们根据不同的平台执行不同的代码,以让我们的代码支持不同的平台,如:
#ifTARGET_OS_IPHONE
#define MAS_VIEWUIView
#elifTARGET_OS_MAC
#define MAS_VIEWNSView
#endif
在使用swift语言进行开发中,则使用的是build configurations(构建配置)来支持条件编译。Build configurations已经包含了字面量true和false,以及两个平台测试函数os()和arch()。
其中os()用于测试系统类型,可传入的参数包含OSX, iOS, watchOS,所以上面的代码在swift可改成:
#if os(iOS)
typealiasMAS_VIEW = UIView
#elseif os(OSX)
typealiasMAS_VIEW = NSView
www.maiziedu.com
#endif
但os()只能检测系统类型,而无法检测系统的版本,所以这些工作只能放在运行时去处理。
而arch()则主要是用于测试CPU的架构,可传入的值包括x86_64, arm, arm64, i386。需要注意的是arch(arm)对于ARM 64的设备来说,不会返回true。而arch(i386)在32位的iOS模拟器上编译时会返回true。
如果我们想自定义一些在调试期间使用的编译配置选项,则可以使用-D标识来告诉编译器,具体操作是在”BuildSetting”–>“Swift Compiler-Custom Flags”–>“Other Swift Flags”–>“Debug”中添加所需要的配置选项。如我们想添加常用的DEGUB选项,则可以在此加上”-D DEBUG”。这样我们就可以在代码中来执行一些debug与release时不同的操作,如
#if DEBUG
let totalSeconds= totalMinutes
#else
let totalSeconds= totalMinutes * 60
#endif
一个简单的条件编译声明如下所示:
#if buildconfiguration
statements
#else
statements
#endif
当然,statements中可以包含0个或多个有效的swift的statements,其中可以包括表达式、语句、和控制流语句。另外,我们也可以使用&&和||操作符来组合多个build configuration,同时,可以使用!操作符来对buildconfiguration取反,如下所示:
#if buildconfiguration && !build configuration
statements
#elseif buildconfiguration
statements
#else
statements
#endif
需要提醒大家的一点就是,在运用swift开发ios系统时,条件编译语句必须在语法上是有效的,因为即使这些代码不会被编译,swift也会对其进行语法检查。