Objective-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();
}
Может ли кто-нибудь предложить лучшее решение?
some_condition
также в блокеelse
блокаif (@available...
...? - person Nicolas Miari   schedule 27.10.2017elseBlock()
на[self elseMethod];
- person RobP   schedule 27.06.2018