在Swift中检查类是否存在

23

我想在我的Swift iOS应用程序中使用NSURLQueryItem。但是,该类仅适用于iOS 8及更高版本,但我的应用程序也应该在iOS 7上运行。我该如何在Swift中检查类的存在?

在Objective-C中,你会这样做:

if ([NSURLQueryItem class]) {
    // Use NSURLQueryItem class
} else {
    // NSURLQueryItem is not available
}

与此问题相关的是:如何检查现有类的方法或属性存在性?

https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/AdvancedAppTricks/AdvancedAppTricks.html#//apple_ref/doc/uid/TP40007072-CH7-SW4 中有一个很好的部分,称为支持多个iOS版本,介绍了Objective-C的不同技术。这些如何转换为Swift?


看看这个答案,对我有用:https://dev59.com/VmAf5IYBdhLWcg3weyzZ#24956190 - s4y
3个回答

16

Swift 2.0 提供了一个简单而自然的方法来进行此操作。它被称为 API 可用性检查。由于 NSURLQueryItem 类仅在 iOS8.0 及以上版本可用,您可以在运行时使用以下方式进行检查。

    if #available(iOS 8.0, *) {
        // NSURLQueryItem is available

    } else {
        // Fallback on earlier versions
    }

这适用于平台相关的类吗,例如 HealthKit? - lewis

15

我知道的最简单的方法

if NSClassFromString("NSURLQueryItem") != nil {
    println("NSURLQueryItem exists")
}else{
    println("NSURLQueryItem does not exists")
}

4
虽然此解决方案在调试设置下运行良好,但在使用发布设置构建应用时会失败。 - Aleksejs Mjaliks

11

试试这个:

if objc_getClass("NSURLQueryItem") != nil {
   // iOS 8 
} else {
   // iOS 7
}

我也是这样做的:

if let theClass: AnyClass = NSClassFromString("NSURLQueryItem") {
    // iOS 8
} else {
    // iOS 7
}

或者,你也可以像这样检查系统版本,但这并不是iOS开发的最佳实践-真正的做法是检查一个功能是否存在。但我已经在一些iOS 7的黑客中使用了这个...实用主义胜过纯粹。

    switch UIDevice.currentDevice().systemVersion.compare("8.0.0", options: NSStringCompareOptions.NumericSearch) {
    case .OrderedSame, .OrderedDescending:
        iOS7 = false
    case .OrderedAscending:
        iOS7 = true
    }

那个“if let theClass”在我的情况下非常有用,因为我首先需要检查第三方类是否存在,然后再使用它。 - JOM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接