如何将代码从AppExtension中排除?@available(iOSApplicationExtension, unavailable) 无效问题排查与解决
解决AppExtension中工具类编译错误的方案
首先得搞清楚为什么你加的@available(iOSApplicationExtension, unavailable)没生效:这个注解的作用是禁止在应用扩展中调用这个方法,但编译器仍然会尝试编译这个方法的内部代码——而你的方法返回了UIUserInterfaceStyle,这个类型在iOS 12.0之前的应用扩展里是不可用的,所以编译器还是会抛出可用性错误。
Xcode建议的@available(iOSApplicationExtension 12.0, *)是让这个方法仅在iOS 12+的扩展中可用,但这不符合你“彻底排除这段代码在扩展中编译”的需求,推荐你用下面的方案:
方案:用编译条件完全排除代码块
苹果为应用扩展的target提供了预编译宏TARGET_IS_EXTENSION,你可以用这个宏把整个方法包裹起来,让它只在主App的编译过程中存在:
#if !TARGET_IS_EXTENSION class var applicationInterfaceStyle: UIUserInterfaceStyle { // 已停用方法代码,仅返回默认值 return .unspecified } #endif
这样在AppExtension/Widget的编译过程中,这段代码会被直接忽略,完全不会触发可用性检查,完美实现你“彻底排除”的需求。
内容的提问来源于stack exchange,提问作者Andrei Herford
相关产品推荐
相关产品推荐

