【译】Swift系统版本检查

344 阅读3分钟

原文地址 Swift System Version Checking

虽然说斯威夫特“没有C”是不准确的,但这是因为斯威夫特与目标C缺乏相似之处,而不是没有C。

Swift当然从Haskell、Rust、Python、D和其他现代语言中获得灵感,但是人们也许可以最好地理解这种语言,因为它拒绝了C语言中的所有缺陷:

  • 默认情况下,C是不安全的。默认情况下,Swift是安全的*(因此指针操作函数的命名不安全)*。

  • C具有未定义的行为。Swift具有定义良好的行为。

  • C使用的预处理器指令具有无法形容的邪恶。Swift有一个安全的预处理器指令子集。

人们甚至可以说,Swift类型系统是专门为C++设计的。

在目标C中,检查API的可用性是通过C预处理器指令、类上的条件、响应到选择器:和实例响应到选择器::的组合来完成的

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

然而,如前所述,Swift的编译器指令**受到了极大的限制,只允许针对特定操作系统、体系结构和语言版本**进行编译器标志和条件编译:

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

FunctionValid Argumentsos()macOS, iOS, watchOS, tvOS, Linuxarch()x86_64, arm, arm64, i386swift()>= followed by a version number

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

不幸的是,os()’提供任何关于mac OS或ios的特定版本的见解,这意味着必须在运行时进行检查。而且Swift对零的**处理**不太宽容,检查常量的目标C风格会导致崩溃。

那么,如何在Swift中检查系统版本以确定应用编程接口的可用性呢?请继续阅读以了解情况。

过程信息

考虑到在运行时需要一个Swift友好的应用编程接口来确定应用编程接口版本,ios 8在Process Info上引入了操作系统版本属性和操作系统至少方法。这两个应用编程接口都使用了一个新的操作系统版本值类型,它包含主要版本、次要版本和补丁版本。

苹果软件发布遵循**语义版本控制**约定。

操作系统

对于一个简单的检查,比如这个应用程序“运行在ios 9上?”,是最直接的方法。

if ProcessInfo().isOperatingSystemAtLeast(OperatingSystemVersion(majorVersion: 9, minorVersion: 0, patchVersion: 0)) {    print("iOS >= 9.0.0")}

操作系统版本

对于更复杂的版本比较,可以直接检查操作系统版本。将此与Swift模式匹配和开关语句结合起来,以获得语法简洁:

let os = ProcessInfo().operatingSystemVersionswitch (os.majorVersion, os.minorVersion, os.patchVersion) {case (8, 0, _):    println("iOS >= 8.0.0, < 8.1.0")case (8, _, _):    println("iOS >= 8.1.0, < 9.0")case (9, _, _):    println("iOS >= 9.0.0")default:    // this code will have already crashed on iOS 7, so >= iOS 10.0    println("iOS >= 10.0.0")}

UID evice system Version

作为替代方案,可以使用system Version属性UID evice:

switch UIDevice.current.systemVersion.compare("8.0.0", options: .numeric) {case .orderedSame, .orderedDescending:    print("iOS >= 8")case .orderedAscending:    print("iOS < 8.0")}

在比较版本号字符串时使用String. Compare Options. Numic来确保,例如,"2.5" < "2.10"。

字符串比较和比较结果’不像操作系统版本这样的专用值类型那么性感,但它仍然可以完成任务。

NSA ppKit版本

确定API可用性的另一种方法是检查框架版本号。不幸的是,基金会的NS Foundation Version Number和核心基金会的kCF Core Foundation Version Number在历史上已经过时,缺少了过去操作系统版本的常量。

对于ios来说,这是一个死胡同,但是mac OS可以非常可靠地检查AppKit的版本,使用NS AppKit Version:

if NSAppKitVersion.current.rawValue >= .macOS10_10.rawValue {    println("macOS >= 10.10")}

如果您将其与扩展配对以使NS AppKit Version符合可比,您也可以删除。

总而言之,以下是您需要了解的关于在Swift中检查系统版本的信息:

  • 使用#if os(ios)预处理器指令区分ios(UI Kit)和mac OS(AppKit)目标。

  • 对于ios 8.0或更高版本的最低部署目标,请使用Process Info操作系统版本或is操作系统至少。

  • 对于ios 7.1或以下的最低部署目标,请使用UID evice system Version上的比较与字符串。比较选项。数字。

  • 对于mac OS部署目标,请将NS AppKit Version与可用的AppKit常量进行比较。