原文链接:http://nshipster.com/swift-system-version-checking/

前言

C VS Swift

  • C不安全 (这里主要指指针的使用)
  • C中有未定义的行为 (只声明,不初始化)
  • C中的预处理器解释功能缺陷

OC中的API检查主要是通过C预处理根据当前classs发送respondsToSelector:instancesRespondToSelector:来达成的:

#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
if ([NSURLSession class] &&
    [NSURLSessionConfiguration respondsToSelector:@selector(backgroundSessionConfigurationWithIdentifier:)]) {
    // ...
}
#endif

Swift根据特定系统以及指令集架构对编译器做了完全的限制。

#if DEBUG
     println("OTHER_SWIFT_FLAGS = -D DEBUG")
#endif

Function Valid Arguments
os() OSX, iOS
arch() x86_64, arm, arm64, i386

#if os(iOS)
    var image: UIImage?
#elseif os(OSX)
    var image: NSImage?
#endif

不幸的是,os()没有提供OS X与iOS特定的版本号,这也意味着我们只能在运行时进行检查。

NSProcessInfo

为了让Swift增加运行时API版本判断的接口友好性,iOS8在NSProcessInfo类增加了operatingSystemVersion属性以及isOperatingSystemAtLeastVersion方法。

isOperatingSystemAtLeastVersion

为了检验APP是不是在iOS8上跑,isOperatingSystemAtLeastVersion方法是最直接的方法:

if NSProcessInfo().isOperatingSystemAtLeastVersion(NSOperatingSystemVersion(majorVersion: 8, minorVersion: 0, patchVersion: 0)) {
    println("iOS >= 8.0.0")
}

operatingSystemVersion

若想做版本对比,可以直接校验operatingSystemVersion属性,配上Swift中的switch语句。

let os = NSProcessInfo().operatingSystemVersion
switch (os.majorVersion, os.minorVersion, os.patchVersion) {
case (8, _, _):
    println("iOS >= 8.0.0")
case (7, 0, _):
    println("iOS >= 7.0.0, < 7.1.0")
case (7, _, _):
    println("iOS >= 7.1.0, < 8.0.0")
default:
    println("iOS < 7.0.0")
}

注意:使用NSStringCompareOptions.NumericSearch进行版本字符串数值比较的时候,举个栗子:
"2.5" < "2.10"。

使用NSComparisonResult效果也是一样的。

NSAppKitVersionNumber

另外一个确认API是否可用的方式是去校验框架版本号。不幸的是,FoundationNSFoundationVersionNumberCore FoundationkCFCoreFoundationVersionNumber已经弥久未更了。
但是在OS XAPPKit中的NSAppKitVersionNumber我们还是能够获取我们想要的信息:

if rint(NSAppKitVersionNumber) > NSAppKitVersionNumber10_9 {
    println("OS X >= 10.10")
}

使用rint先四舍五入版本号后再与NSAppKitVersionNumber做比较。

总结

Swift中系统版本号校验须知:

  • 使用#if os(iOS)预处理器来判断目标对象是iOS (UIKit)亦或是OS X (AppKit)
  • 最小配置对象如果是8.0以上,使用NSProcessInfo operatingSystemVersion或者isOperatingSystemAtLeastVersion
  • 如果配置对象是7.1以下,在UIDevice systemVersion使用compare中的NSStringCompareOptions.NumericSearch进行版本确认。
  • 如果是OS X上的部署,可以使用AppKit中的NSAppKitVersionNumber常量进行对比。

Cruise_Chan
729 声望71 粉丝

技能树点歪了...咋办


« 上一篇
Unix基础