Отменить #доступный оператор
Если вы хотите выполнить блок кода только на устройствах, работающих с ОС старше iOS8
. Я не могу:
if #available(iOS 8.0, *) == false {
doFoo()
}
Решение, которое я использую сейчас, это:
if #available(iOS 8.0, *) { } else {
doFoo()
}
но он чувствует себя неуклюжим. Есть ли другой способ отменить утверждение #available
элегантно с помощью swift2?
Ответы
Ответ 1
Невозможно иметь логику вокруг инструкции #available
.
В самом деле, оператор используется компилятором для определения того, какие методы могут быть вызваны в пределах области охвата, которую он охватывает, поэтому во время выполнения ничего не может быть сделано, что условно выполнит блок.
Можно, однако, комбинировать условия, используя запятую, следующим образом
if #available(iOS 8.0, *), myNumber == 2 {
// some code
}
Ответ 2
Я использую guard
для этого:
guard #available(iOS 8.0, *) else {
// Code for earlier OS
}
Там небольшой потенциал для неловкости, так как guard
требуется для выхода из области, конечно. Но это легко обойти, поместив все это в свою собственную функцию или метод:
func makeABox()
{
let boxSize = .large
self.fixupOnPreOS8()
self.drawBox(sized: boxSize)
}
func fixupOnPreOS8()
{
guard #available(iOS 8, *) else {
// Fix up
return
}
}
который действительно легко удалить при отмене поддержки более ранней системы.
Ответ 3
Кажется, это лучшее решение, перед Swift2 вам пришлось использовать другие методы, такие как использование готовых к использованию классов, написанных отдельными людьми. Но это прекрасно, вы можете установить переменную в viewDidLoad()
и использовать ее для обнаружения старых устройств:
var isNewerThan8: Bool = false
func viewDidLoad(){
if #available(iOS 8.0, *) {
isNewerThan8 = true
} else {
isNewerThan8 = false
}
}
func myFunction(){
if isNewerThan8 {
//foo
}else{
//boo
}
}