Согласно предварительная версия документации Swift 2 теперь есть ключевое слово #available
, которое можно использовать с оператором if let
или guard
для проверки доступности API. Это дает следующий пример:
let locationManager = CLLocationManager()
if #available(iOS 8.0, OSX 10.10, *) {
locationManager.requestWhenInUseAuthorization()
}
Or
let locationManager = CLLocationManager()
guard #available(iOS 8.0, OSX 10.10, *) else { return }
locationManager.requestWhenInUseAuthorization()
То, что он (документ) утверждает, эквивалентно следующему коду Objective-C:
if ([CLLocationManager instancesRespondToSelector:@selector(requestWhenInUseAuthorization)]) {
// Method is available for use.
} else {
// Method is not available.
}
Очевидно, что respondsToSelector:
работает только с подклассами NSObject
, тогда как ключевое слово #available
будет работать даже для «чистого» кода Swift, поэтому я ценю это преимущество.
Однако с самого начала разработки iOS меня всегда убеждали, что лучше всего в этой ситуации обнаруживать наличие API, а не полагаться на версию, которую он представил.
В качестве более конкретного примера я имею в виду, когда Apple представила firstObject
на NSArray
в iOS 7, но задним числом сделала его доступным обратно в iOS 4 (где он был доступен, но приватно). Любой код, использующий respondsToSelector:
, работал бы на iOS ‹ 7, но, очевидно, проверка версии не удалась.
Есть ли какие-то преимущества в переходе на ключевое слово #available
, которое я пропустил?
respondsToSelector
в Swift выглядит уродливо, потому что вам нужно указать имя метода в виде строки (также в соглашении об именах методов Obj-C) :) Я не уверен, что#available
является улучшением, но это поможет согласованности кода, потому что рано или поздно останутся Swift только фреймворки. С другой стороны, проверка версии доступна только для системной версии, поэтому для внешних библиотек вам все равно придется использовать проверку селектора. - person Sulthan   schedule 11.09.2015@availability
. В качестве примечания я не уверен в совместимости использованияif #available...
с методами Objective-C, аннотированнымиNS_AVAILABLE
. Я полностью согласен с тем, чтоrespondsToSelector:
имеет свои проблемы даже в Objective-C, и необходимость указывать селектор в виде строки в Swift просто ужасна. Я за лучший способ, но #доступный кажется (мне) скорее шагом в сторону, чем шагом вперед. - person Steve Wilford   schedule 11.09.2015firstObject
была бы невозможна со Swift. И поскольку это невозможно, я бы предположил, что методif #available
подходит для всех случаев в Swift. - person Adam   schedule 11.09.2015