检查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?

Swift 2.0为我们提供了一个简单而自然的方法来实现这个function。它被称为API可用性检查。 NSURLQueryItem类只在iOS8.0以上版本中可用,所以你可以用这种风格在运行时检查它。

  if #available(iOS 8.0, *) { // NSURLQueryItem is available } else { // Fallback on earlier versions } 

最简单的方法我知道

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

尝试这个:

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

我也是这样做的:

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

或者,你也可以像这样检查系统版本,但是这不是iOS开发的最佳实践 – 你真的应该检查一个function是否存在。 但是我已经使用了这几个iOS 7黑客…纯粹的实用主义。

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