Objective-C @ guarda disponível AND'ed com mais condições

O objetivo-C tem um@available expressão no XCode 9+ / LLVM 5+, que permite proteger um bloco de código para pelo menos uma determinada versão do sistema operacional, para que ele não emita avisos de disponibilidade desprotegidos se você usar APIs disponíveis apenas nessa versão do sistema operacional.

O problema é que essa proteção de disponibilidade é que ela só funciona se for a única expressão na condição de umif. Se você o usar em qualquer outro contexto, receberá um aviso:

@available does not guard availability here; use if (@available) instead

Por exemplo, não funcionará se você tentar AND verificar a disponibilidade com outras condições noif:

if (@available(iOS 11.0, *) && some_condition) {
  // code to run when on iOS 11+ and some_condition is true
} else {
  // code to run when on older iOS or some_condition is false
}

Qualquer código que usa APIs do iOS 11 dentro doif bloco ou emsome_condition ainda gerará avisos de disponibilidade desprotegidos, embora seja garantido que esses trechos de código só possam ser alcançados no iOS 11 ou superior.

Eu poderia transformá-lo em dois aninhadosifs, mas então oelse código teria que ser duplicado, o que é ruim (especialmente se houver muito código):

if (@available(iOS 11.0, *)) {
  if (some_condition) {
    // code to run when on iOS 11+ and some_condition is true
  } else {
    // code to run when on older iOS or some_condition is false
  }
} else {
  // code to run when on older iOS or some_condition is false
}

Eu posso evitar duplicação refatorando oelse código de bloco em uma função anônima, mas isso requer a definição doelse bloco antes doif, o que dificulta o fluxo do código:

void (^elseBlock)(void) = ^{
  // code to run when on older iOS or some_condition is false
};

if (@available(iOS 11.0, *)) {
  if (some_condition) {
    // code to run when on iOS 11+ and some_condition is true
  } else {
    elseBlock();
  }
} else {
  elseBlock();
}

Alguém pode encontrar uma solução melhor?

questionAnswers(6)

yourAnswerToTheQuestion