虽然说斯威夫特“没有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常量进行比较。