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

Отменить #доступный оператор

Если вы хотите выполнить блок кода только на устройствах, работающих с ОС старше iOS8. Я не могу:

if #available(iOS 8.0, *) == false {
    doFoo() 
}

Решение, которое я использую сейчас, это:

if #available(iOS 8.0, *) { } else { 
    doFoo() 
}

но он чувствует себя неуклюжим. Есть ли другой способ отменить утверждение #available элегантно с помощью swift2?

4b9b3361

Ответ 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
   }
}