为什么预处理程序指令不起作用

时间:2016-07-15 11:28:43

标签: ios swift swift2 preprocessor

我正在尝试按照版本为设备创建变量,但我的控件总是转到else部分。我的iOS是9.3

#if os(iOS) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 90000
    var addressBookRef : CNContactStore? = nil
#else
    var addressBookRef : ABAddressBook? = nil
#endif

我也按建议here尝试了此操作,但defined没有接受Swift2.x

#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 90000
    var addressBookRef : CNContactStore? = nil
#else
    var addressBookRef : ABAddressBook? = nil
#endif

当我在运行时检查并使用断点时,我可以看到我的控件总是转到其他部分而变量addressBookRef的类型为ABAddressBook

建议我做错了什么

1 个答案:

答案 0 :(得分:3)

您无法使用指令检查iOS的版本,您需要在运行时检查它。

如果您使用的是iOS 8.0或更高版本,则可以使用:

let os = NSProcessInfo().operatingSystemVersion
switch (os.majorVersion, os.minorVersion, os.patchVersion) {
case (8, 0, _):
    // 8.0.0 and < 8.1.0
case (8, _, _):
    // 8.1.0 and < 9.0
case (9, _, _):
    // 9.0.0
default:
    //
}

您还可以使用UIDevice.currentDevice().systemVersion,它也适用于iOS 7:

switch UIDevice.currentDevice().systemVersion.compare("8.0.0", options: NSStringCompareOptions.NumericSearch) {
case .OrderedSame, .OrderedDescending:
    // >= 8.0
case .OrderedAscending:
    // < 8.0
}