检查Swift中是否存在类

时间:2014-08-14 11:08:13

标签: ios swift

我想在我的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?

3 个答案:

答案 0 :(得分:14)

我知道的最简单方法

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

答案 1 :(得分:14)

Swift 2.0为我们提供了一种简单而自然的方法。它被称为API可用性检查。因为NSURLQueryItem类仅在iOS8.0之后可用,所以你可以用这种方式在运行时检查它

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

    } else {
        // Fallback on earlier versions
    }

答案 2 :(得分:10)

试试这个:

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
    }