20

仅当当前设备的 iOS 版本低于此处指定的特定版本时,我才想运行一段代码。苹果给出的代码示例如下所示:

if (@available(iOS 10.0, *)) {
  // iOS 10.0 and above
} else {
  // below 10.0
}

但是,在某些情况下,仅当当前 iOS 版本低于特定版本时才希望运行代码。我假设以下代码将起作用:

if (!@available(iOS 10.0, *)) {
  // below 10.0
}

但是,这似乎不起作用,并且我从 Xcode 收到以下警告:

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

是添加了我看到的诊断的 LLVM 提交。

该问题有两个可能的后备方案:

  1. 使用if-else变体而不向if块中添加任何代码(不是很优雅)。
  2. 继续使用旧方法,例如-[NSProcessInfo isOperatingSystemAtLeastVersion:].

还有另一种使用@available我想念的方法吗?

4

3 回答 3

11

的想法@available是您想要使用仅在某些系统上可用的 API。对于其他系统,您的应用程序中缺少该功能,或者您提供了替代功能。对于您不需要超出某个操作系统版本的任何代码的情况,使用它的正确方法仅在下面是

if (@available(iOS 10.0, *)) {
    // Happens automatically on on iOS 10 and beyond
} else {
    someOtherCode();
}

这样做的原因是编译器有时必须对受保护的代码执行一些额外的魔法@available,因此它需要清楚地识别出这种情况。所以实际上它明确地搜索

if (@available(...)) {

只允许空格和换行的变化。是的,您可能会争辩说,一个 not ( !) 实际上一点也不复杂,但是您会在哪里划清界限呢?关于什么:

if ((todayIsTuesday() && @available(iOS 9.0, *)) 
    || (self.theWeatherIsNice && !@available(iOS 11.0, *)) {

因此,只允许一个简单的语句,它只强制编译器将代码分成两个部分,并且总是只有一个部分会运行:一个用于列出的操作系统,一个用于其余部分。当然,“其余”可以再细分一次,else if是允许的。如果缺少,只有 else 部分可以自动生成,所以当你写这个时:

if (@available(...)) {
    someCode();
} // There is no else

编译器也很高兴,因为这与

if (@available(...)) {
     someCode();
} else {
    // Nothing to do here
}
于 2018-12-07T19:26:47.357 回答
1
if (@available ...) {
   ...
} else {
   ...
}

是唯一允许的形式。它必须是这样的,因为不同的规则适用于 if-part 和 else-part。在 if 部分中,您可以调用一个 SDK 中可用的方法,在 else 部分中,它是来自另一个 SDK 的方法。同一个调用在一个分支中是合法的,而在另一个分支中是非法的,或者在一个分支中被弃用而不在另一个分支中被弃用。

于 2018-12-07T20:15:05.957 回答
1

您可以定义自己的自定义宏,您可以在整个应用程序中使用这些宏。例子:-

#define isIOS11() ([[UIDevice currentDevice].systemVersion doubleValue]>= 11.0 && [[UIDevice currentDevice].systemVersion doubleValue] < 12.0)

或者

#define SinceIOS9_2 ([[UIDevice currentDevice].systemVersion doubleValue]>= 4.2 && [[UIDevice currentDevice].systemVersion doubleValue] < 9.2)

像下面这样使用它:-

if (isIOS11()) {
    // Do something for iOS 11 
} else {
    // Do something iOS Versions below 11.0
}

请让我知道这是否适合您。

于 2018-01-18T08:42:37.903 回答