【问题标题】:Check for class existence in Swift在 Swift 中检查类是否存在
【发布时间】:2014-10-08 00:24:29
【问题描述】:

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

【问题讨论】:

标签: ios swift


【解决方案1】:

Swift 2.0 为我们提供了一种简单自然的方式来做这件事。它被称为 API 可用性检查。因为NSURLQueryItem 类只在 iOS8.0 以后才可用,你可以用这种方式在运行时检查它。

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

    } else {
        // Fallback on earlier versions
    }

【讨论】:

  • 这是否适用于依赖于平台的类,例如 HealthKit?
【解决方案2】:

我知道的最简单的方法

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

【讨论】:

  • 虽然此解决方案适用于调试设置,但在使用发布设置构建应用时会失败。
【解决方案3】:

试试这个:

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”在我的情况下最有用,我首先需要检查 3rd 方类是否存在然后使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-12
  • 1970-01-01
  • 1970-01-01
  • 2018-06-21
相关资源
最近更新 更多