Возможно, это не самое элегантное решение, но если вы хотите, чтобы оно было простым, это альтернатива.
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();
}
Может кто-нибудь придумать лучшее решение?