gpt4 book ai didi

ios - Objective-C @available 守卫与更多条件

转载 作者:IT王子 更新时间:2023-10-29 08:03:43 30 4
gpt4 key购买 nike

Objective-C 有一个 @available expression在 XCode 9+/LLVM 5+ 中,它允许您保护至少某个操作系统版本的代码块,这样如果您使用仅在该操作系统版本上可用的 API,它就不会发出不 protected 可用性警告。

问题在于,这种可用性保护只有在它是 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
}

任何在 if block 或 some_condition 中使用 iOS 11 API 的代码仍然会生成不 protected 可用性警告,即使保证这些代码片段只能在 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 block 代码重构为匿名函数来避免重复,但这需要在 if 之前定义 else block ,这使得代码流程难以遵循:

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

谁能想出更好的解决方案?

最佳答案

当函数中间有复杂的条件代码使流程变得复杂时,你会做你经常做的事情:将它提升到另一个函数中。

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

// code to run when on older iOS or some_condition is false
}

或者您将检查提升到通用代码中(请参阅 Josh Caswell 的;它比我最初编写此代码的方式更好)。

关于ios - Objective-C @available 守卫与更多条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46965347/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com