“if (@available(iOS 13.0, *))” 在 Xcode 10.3 中无法编译

Posted

技术标签:

【中文标题】“if (@available(iOS 13.0, *))” 在 Xcode 10.3 中无法编译【英文标题】:"if (@available(iOS 13.0, *))" doesn't compile in Xcode 10.3 【发布时间】:2019-09-24 15:08:27 【问题描述】:

我有这样的代码:

if (@available(ios 13.0, *)) 
    if([getMetalDevice() supportsFamily:MTLGPUFamilyApple3])
        pixelFormat = MTLPixelFormatBGRA10_XR;
    else
        pixelFormat =  MTLPixelFormatBGRA8Unorm;

它适用于 Xcode 11,但不适用于 Xcode 10.3。 预处理器说它不知道 MTLGPUFamilyApple3 是什么(在 iOS 13 中引入)。

我尝试使用预处理器宏:

#define isIOS13 (floor(NSFoundationVersionNumber) >= NSFoundationVersionNumber_iOS_13_0)  

但是预处理器抱怨Function-like macro 'floor' is not defined

#define isIOS13 (int(NSFoundationVersionNumber) >= NSFoundationVersionNumber_iOS_13_0)

出于稳定性原因,我需要同时使用 Xcode 10.3 (iOS 12.4) 和 Xcode 11 (iOS 13.0)。

如何使我的代码在两个 Xcode 中都工作?

【问题讨论】:

***.com/questions/28765740/xcode-version-preprocessor @Almo 我在您提供的链接中看到了__apple_build_version__,但没有示例如何使用它 使用 Xcode 10.3 构建的应用程序无论如何都不支持MTLGPUFamilyApple3。您确定在两个 Xcode 上都需要支持项目编译吗? @Cy-4AH Xcode 10.3 will not support MTLGPUFamilyApple3 - 是的,但它会用#ifdef Xcode11 编译代码。我的团队一部分在 Xcode11 工作,另一部分与 Appium 合作进行自动化测试,Appium 对真实设备的支持对于 Xcode 11 来说还不是很好。 @OlhaPavliuk 在这种情况下,我认为问题出在 Xcode 11 二进制文件中。例如,我见过损坏的 UI,但如果我使用 Xcode 10.1 构建一切都很好。我认为您将分发使用 Xcode 11 构建的二进制文件,并且无法信任使用 10.3 构建的二进制文件执行的测试。 【参考方案1】:
#ifdef __IPHONE_13_0
if (@available(iOS 13.0, *)) 
    if([getMetalDevice() supportsFamily:MTLGPUFamilyApple3])
        pixelFormat = MTLPixelFormatBGRA10_XR;
    else
#else

#endif
        pixelFormat =  MTLPixelFormatBGRA8Unorm;

但只有在您提供一些支持多个 Xcode 的开源库时,您才应该使用此代码。

如果这是您项目的一部分,您应该迁移到新的 Xcode 并 不会使用预处理器运算符使您的代码过于复杂。

最好用 Appium 来解决问题,而不是这个。

【讨论】:

以上是关于“if (@available(iOS 13.0, *))” 在 Xcode 10.3 中无法编译的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 iOS 设备不扫描广告扩展程序?

iOS. 通过appleId进行苹果第三方登录

在窗口中删除和添加视图时键盘/工具栏中断