检查Swift中是否存在类

Flo*_*ian 22 ios swift

我想在我的Swift iOS应用程序中使用NSURLQueryItem.但是,该类仅在iOS 8中可用,但我的应用程序也应该在iOS 7上运行.如何在Swift中检查类是否存在?

在Objective-C中,您可以执行以下操作:

if ([NSURLQueryItem class]) {
    // Use NSURLQueryItem class
} else {
    // NSURLQueryItem is not available
}
Run Code Online (Sandbox Code Playgroud)

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

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

Sea*_*ean 15

我知道的最简单的方法

if NSClassFromString("NSURLQueryItem") != nil {
    println("NSURLQueryItem exists")
}else{
    println("NSURLQueryItem does not exists")
}
Run Code Online (Sandbox Code Playgroud)

  • 虽然此解决方案适用于调试设置,但是当应用程序使用发布设置构建时,它会失败. (4认同)

tou*_*bun 15

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

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

    } else {
        // Fallback on earlier versions
    }
Run Code Online (Sandbox Code Playgroud)


ban*_*isa 11

试试这个:

if objc_getClass("NSURLQueryItem") != nil {
   // iOS 8 
} else {
   // iOS 7
}
Run Code Online (Sandbox Code Playgroud)

我也是这样做的:

if let theClass: AnyClass = NSClassFromString("NSURLQueryItem") {
    // iOS 8
} else {
    // iOS 7
}
Run Code Online (Sandbox Code Playgroud)

或者,您也可以检查系统版本,但这不是iOS开发的最佳实践 - 实际上您应该检查功能是否存在.但是我已经将它用于一些iOS 7黑客......实用主义超过了纯度.

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