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