Според документация за предварителна версия на 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 е просто ужасно. Аз съм за по-хубав начин, но #available изглежда (на мен) по-скоро като странична стъпка, отколкото стъпка напред. - person Steve Wilford   schedule 11.09.2015firstObject
не би била възможна със Swift. И тъй като не е възможно, бих предположил, че методътif #available
е добър за всички случаи в Swift. - person Adam   schedule 11.09.2015