Проверьте наличие класса в 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?
Ответы
Ответ 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
}