Objetivo-C @ guardia disponible Y con más condiciones

Objective-C tiene un@available expresión en XCode 9+ / LLVM 5+ que le permite proteger un bloque de código al menos a una determinada versión del sistema operativo para que no emita advertencias de disponibilidad sin protección si utiliza API que solo están disponibles en esa versión del sistema operativo.

El problema es que esta protección de disponibilidad es que solo funciona si es la única expresión en la condición de unif. Si lo usa en cualquier otro contexto, recibirá una advertencia:

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

Entonces, por ejemplo, no funciona si intenta Y la verificación de disponibilidad con otras condiciones en elif:

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
}

Cualquier código que use API de iOS 11 dentro delif bloque o ensome_condition aún generará advertencias de disponibilidad sin protección, aunque está garantizado que solo se puede acceder a esos códigos cuando se usa iOS 11+.

Podría convertirlo en dos anidadosifs, pero luego elelse el código tendría que estar duplicado, lo cual es malo (especialmente si es mucho 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
}

Puedo evitar la duplicación refactorizando elelse bloquear el código en una función anónima, pero eso requiere definir elelse bloque antes delif, lo que hace que el código fluya difícil de seguir:

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();
}

¿Alguien puede encontrar una mejor solución?

Respuestas a la pregunta(6)

Su respuesta a la pregunta