Возможно, это не самое элегантное решение, но если вы хотите, чтобы оно было простым, это альтернатива.

tive-C имеет@available выражение в XCode 9+ / LLVM 5+, который позволяет защитить блок кода как минимум до определенной версии ОС, чтобы он не выдавал неохраняемые предупреждения о доступности, если вы используете API, которые доступны только в этой версии ОС.

Проблема заключается в том, что эта защита доступности заключается в том, что она работает, только если она является единственным выражением в условииif, Если вы используете его в любом другом контексте, вы получите предупреждение:

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

Так, например, это не сработает, если вы попытаетесь И проверить доступность с другими условиями вif:

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
}

Любой код, который использует API iOS 11 внутриif блок или вsome_condition по-прежнему будет генерировать неохраняемые предупреждения о доступности, хотя гарантируется, что эти фрагменты кода будут доступны только на iOS 11+.

Я мог бы превратить его в два вложенныхifс, но тогдаelse код должен быть дублирован, что плохо (особенно если в нем много кода):

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
}

Я могу избежать дублирования путем рефакторингаelse код блока в анонимную функцию, но для этого необходимо определитьelse блок передif, что затрудняет отслеживание потока кода:

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

Может кто-нибудь придумать лучшее решение?

Ответы на вопрос(6)

Ваш ответ на вопрос