“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 中无法编译的主要内容,如果未能解决你的问题,请参考以下文章