iOS开发——Swift实用技术篇&检查系统版本

Swift如何检查系统版本

指责Swift是“没有C的Objective-C”的说法不够准确,是因为Swift和Objective-C缺少相似之处,而不是没有C。Swift根本不是类C语言。

毫无疑问Swift从Haskell、Rust、Python、D语言等现代编程语言里获得灵感,但你最好把它理解成拒绝了C语言中一些坏掉地方的语言:

  • · C语言是默认类型不安全的。Swift则默认为安全(因此Swift中的指针操作函数命名中加上unsafe)(译者注:见在Swift中使用遗留的C API)。
  • · C语言拥有未定义的行为,Swift中的行为都是经过良好定义的(至少是理论上的,因为编译工具还有些工作要做)。
  • · C语言使用一些非常不安全的预处理器指令能力,Swift则只使用预处理器指令的安全子集。

甚至可以说Swift类型系统的设计,是因为对C++类型系统的不满发泄而来的。

在Objective-C里,检查API的可用性是通过C语言预处理指令来完成的,在class, respondsToSelector:以及instancesRespondToSelector:上的条件式为:


1

2

3

4

5

6

#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000

if ([NSURLSession class] &&

    [NSURLSessionConfiguration respondsToSelector:@selector(backgroundSessionConfigurationWithIdentifier:)]) {

    // ...

}

#endif

然而,就像之前提到的,Swift的编译器指令是非常强约束的,只允许针对特定操作系统和平台来做编译器标记和条件式编辑。


1

2

3

#if DEBUG

    println("OTHER_SWIFT_FLAGS = -D DEBUG")

#endif

相应函数和对应的有效参数分别为:

OS():OSX, iOS

arch():x86_64, arm, arm64, i386


1

2

3

4

5

#if os(iOS)

    var image: UIImage?

#elseif os(OSX)

    var image: NSImage?

#endif

不幸的是,os()不提供特定版本的OS X和iOS的深度信息,表明检查发生在运行时。并且由于Swift对处理nil的不太宽容,对Objective-C风格的常量进行检查会导致程序崩溃。

那么,你应该如何检查Swift中的系统信息来确定API的可用性呢?下面我们就来谈谈。

NSProcessInfo

预 料到开发者对检查系统版本同时又对Swift友好的API的需求,iOS 8在NSProcessInfo中引入了operatingSystemVersion属性和 isOperatingSystemAtLeastVersion方法。两个API都使用了新的NSOperatingSystemVersion数值类 型,它包括majorVersion、minorVersion和patchVersion。

Tips:苹果软件发布的版本号遵循语义化版本约定。

isOperatingSystemAtLeastVersion

对一个简单的检查,比如“这个app能在iOS 8运行吗?” isOperatingSystemAtLeastVersion是最简单明了的方式。


1

2

3

4

5

if

NSProcessInfo().isOperatingSystemAtLeastVersion(NSOperatingSystemVersion(majorVersion:

 8, minorVersion: 0, patchVersion: 0)) {

println("iOS >= 8.0.0")

}

operatingSystemVersion

为了更复杂的版本比较,operatingSystemVersion能够被直接检查。将它和Swift模式比较和switch语句组合,可以使得代码更简洁。


1

2

3

4

5

6

7

8

9

10

11

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")

}

UIDevice systemVersion

可惜的是,新NSProcessInfo API目前并不是特别有用,因为它们在iOS 7上不生效。

作为替代,可以使用systemVersion属性UIDevice来进行检查:


1

2

3

4

5

6

switch UIDevice.currentDevice().systemVersion.compare("8.0.0", options: NSStringCompareOptions.NumericSearch) {

case .OrderedSame, .OrderedDescending:

    println("iOS >= 8.0")

case .OrderedAscending:

    println("iOS < 8.0")

}

Tips:当比较版本号字符串时,使用NSStringCompareOptions.NumericSearch来确定大小的比较,比如”2.5″ < “2.10”。

字符串比较和NSComparisonResult不如特定的数值类型如NSOperatingSystemVersion好用,不过它们的功能是一样的。

NSAppKitVersionNumber

另 一个确定API可用性的方法是检查框架的版本号。不幸的是,Foundation的NSFoundationVersionNumber和Core Foundation的kCFCoreFoundationVersionNumber很早之前就过时了,但过去几个版本的OS发布并没有更新这两个常 量。

这对于iOS来说是无解的,但OS X还可以通过NSAppKitVersionNumber检查AppKit的版本号:


1

2

3

if rint(NSAppKitVersionNumber) > NSAppKitVersionNumber10_9 {

    println("OS X >= 10.10")

}

Tips:苹果在示例代码中使用rint来完成NSAppKitVersionNumber的版本号比较。

将以上的总结一下,在Swift中检查系统版本总共有以下方法。

· 使用#if os(iOS)预编译指令来区别iOS(UIKit)和OS X(AppKit)目标。

· 当最低目标适配为iOS 8以上时,使用NSProcessInfo operatingSystemVersion 或isOperatingSystemAtLeastVersion。

· 如需适配iOS 7或以下的设备,使用UIDevice systemVersion上的compare和 NSStringCompareOptions.NumericSearch。

· 如果是为OS X开发,使用NSAppKitVersionNumber比较生效的AppKit常量。

时间: 2024-08-29 07:11:25

iOS开发——Swift实用技术篇&检查系统版本的相关文章

iOS开发-Swift篇-(1)

iOS开发Swift篇—简单介绍 一.简介 Swift是苹果于2014年WWDC(苹果开发者大会)发布的全新编程语言 Swift在天朝译为“雨燕”,是它的LOGO 是一只燕子,跟Objective-C一样,可以用于开发iOS.Mac应用程序 苹果从2010年7月开始设计Swift语言,耗时4年打造 Swift的语法特点 从它的语法中能看到Objective-C.JavaScript.Python等语言的影子 语法简单.代码简洁.使用方便 可与Objective-C混合使用(相互调用) 为什么要设

iOS开发Swift篇(01) 变量&amp;常量&amp;元组

iOS开发Swift篇(01) 变量&常量&元组 说明: 1)终于要写一写swift了.其实早在14年就已经写了swift的部分博客,无奈时过境迁,此时早已不同往昔了.另外,对于14年部分iOS开发Swift篇专题的博文也不再做任何的校正和更新,特此说明. 2)该博文对应代码可以在https://github.com/HanGangAndHanMeimei/Code获得. 一.变量和常量 01 变量和常量的定义 在swift中变量使用var来修饰,常量使用let来修饰,变量可以修改而常量不

iOS开发Swift篇—简单介绍

iOS开发Swift篇—简单介绍 一.简介 Swift是苹果于2014年WWDC(苹果开发者大会)发布的全新编程语言 Swift在天朝译为“雨燕”,是它的LOGO 是一只燕子,跟Objective-C一样,可以用于开发iOS.Mac应用程序 苹果从2010年7月开始设计Swift语言,耗时4年打造 Swift的语法特点 从它的语法中能看到Objective-C.JavaScript.Python等语言的影子 语法简单.代码简洁.使用方便 可与Objective-C混合使用(相互调用) 为什么要设

李洪强iOS开发Swift篇—09_属性

李洪强iOS开发Swift篇—09_属性 一.类的定义 Swift与Objective-C定义类的区别 Objective-C:一般需要2个文件,1个.h声明文件和1个.m实现文件 Swift:只需要1个.swift文件 Swift中类的定义格式 1 class 类名 { 2 // ... 属性和方法 3 } 二.属性 1.什么是属性 Swift中的属性(Properties),就类似于其他面向对象语言中的成员变量 2.属性的分类 按照官方文档的说明,属性可以分为以下几种 (1)存储属性(Sto

李洪强iOS开发Swift篇—02_变量和常量

李洪强iOS开发Swift篇—02_变量和常量 一.语言的性能 (1)根据WWDC的展示 在进行复杂对象排序时Objective-C的性能是Python的2.8倍,Swift的性能是Python的3.9倍 在实现 RC4加密算法时Objective-C的的性能是Python的127倍,Swift的性能是Python的220倍 有持怀疑态度的国外程序员,也对Objective-C和Swift的性能进行了测试 http://www.splasmata.com/?p=2798 (2)说明 目前的性能不

iOS开发Swift篇(02) NSThread线程相关简单说明

iOS开发Swift篇(02) NSThread线程相关简单说明 一 说明 1)关于多线程部分的理论知识和OC实现,在之前的博文中已经写明,所以这里不再说明. 2)该文仅仅简单讲解NSThread在swift语境中的一些使用和注意点,别他. 3)本文涉及代码可以从https://github.com/HanGangAndHanMeimei/Code地址获得. 二 NSThread的基本使用和创建 1)基本用法(主线程|当前线程) 1 //1.获得执行该方法的当前线程 2 let currentT

李洪强iOS开发Swift篇—03_字符串和数据类型

李洪强iOS开发Swift篇—03_字符串和数据类型 一.字符串 字符串是String类型的数据,用双引号""包住文字内容  let website = "http://www.wendingding.com" 1.字符串的常见操作 (1)用加号 + 做字符串拼接 let scheme = "http://" let path = “www.wendingding.com” let website = scheme + path // websi

李洪强iOS开发Swift篇—01_简单介绍

李洪强iOS开发Swift篇—01_简单介绍 一.简介 Swift是苹果于2014年WWDC(苹果开发者大会)发布的全新编程语言 Swift在天朝译为“雨燕”,是它的LOGO 是一只燕子,跟Objective-C一样,可以用于开发iOS.Mac应用程序 苹果从2010年7月开始设计Swift语言,耗时4年打造 Swift的语法特点 从它的语法中能看到Objective-C.JavaScript.Python等语言的影子 语法简单.代码简洁.使用方便 可与Objective-C混合使用(相互调用)

iOS开发Swift篇(01) 变量、常量、元组

iOS开发Swift篇(01) 变量&常量&元组 说明: 1)终于要写一写swift了.其实早在14年就已经写了swift的部分博客,无奈时过境迁,此时早已不同往昔了.另外,对于14年部分iOS开发Swift篇专题的博文也不再做任何的校正和更新,特此说明. 2)该博文对应代码可以在https://github.com/HanGangAndHanMeimei/Code获得. 一.变量和常量 01 变量和常量的定义 在swift中变量使用var来修饰,常量使用let来修饰,变量可以修改而常量不