Xcode14中Swift方法confirm(intent:)出现Objective-C选择器冲突警告
问题描述
- 环境:Xcode 14,测试运行目标为iOS 16,项目需同时兼容iOS、watchOS双端正常编译。
- 场景:移植适配iOS 14的旧版小组件,新增支持
.accessoryInline、.accessoryRectangular等iOS 16新增的WidgetFamily类型。参考WWDC22 10050号Session方案添加条件宏解决编译报错后,Xcode已无红色编译错误,但出现黄色阻塞警告。 - 警告内容:
Method 'confirm(intent:)' with Objective-C selector 'confirmConfiguration:completion:' conflicts with method 'confirm(intent:completion:)' with the same Objective-C selector; this is an error in Swift 6
- 现状:不修复该警告项目可正常运行,但需消除警告避免后续升级Swift 6出现编译失败。
修复方案
- 根因:不同系统版本下Widget Intent的confirm方法存在两套签名:iOS 14-15、旧版watchOS使用带completion回调的
confirm(intent:completion:),iOS 16、watchOS 9及以上支持Swift异步语法的confirm(intent:)。如果条件编译隔离不彻底,同一编译上下文下会同时存在两个映射到相同Objective-C selector的方法,触发冲突警告。 - 操作步骤:
- 全局搜索项目内Widget Intent实现中的所有confirm方法,定位两个冲突的方法块。
- 为两个方法分别添加严格的平台可用性标记,配合条件编译宏做完全隔离:
- 旧版带completion回调的方法:添加
@available(iOS, introduced: 14.0, deprecated: 16.0, watchOS, introduced: 7.0, deprecated: 9.0)标注,用低版本编译条件宏包裹整个方法实现,确保高版本编译目标下不会引入该方法。 - 新版异步实现的方法:添加
@available(iOS 16.0, watchOS 9.0, *)标注,用高版本编译条件宏包裹整个方法实现,确保低版本编译目标下不会引入该方法。
- 旧版带completion回调的方法:添加
- 按下快捷键
Shift + Command + K清空Xcode编译缓存,重新编译即可消除警告。
- 避坑提示:不要通过添加
@nonobjc标记、修改方法名的方式绕过警告,会导致对应系统版本下小组件Intent配置的确认流程失效。
内容的提问来源于stack exchange,提问作者Medhi
相关产品推荐
相关产品推荐

