Подтвердить что ты не робот

Проверьте наличие класса в Swift

Я хочу использовать NSURLQueryItem в моем приложении Swift iOS. Однако этот класс доступен только с 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?

4b9b3361

Ответ 1

Swift 2.0 предоставляет нам простой и естественный способ сделать это. Он называется проверкой доступности API. Поскольку класс NSURLQueryItem доступен только с iOS8.0, вы можете сделать это в этом стиле, чтобы проверить его во время выполнения.

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

    } else {
        // Fallback on earlier versions
    }

Ответ 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 dev - действительно, вы должны проверить, существует ли функция. Но я использовал это для нескольких хакеров iOS 7... прагматизма по чистоте.

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