Xcode 14 beta下Widget自定义Intent报错如何修复
修复方案
该报错是Xcode版本迭代带来的SiriKit/Intent框架API变更导致:Xcode 12及之前版本自动生成的Intent处理协议,默认支持不带completion回调的方法实现,Xcode 13开始自动生成的协议方法统一要求带completion参数,旧代码里残留的单参数实现会和自动生成的方法产生Objective-C选择器冲突,Swift 6语言模式下会直接触发编译错误。
绝对不要手动编辑标注为「This file was automatically generated and should not be edited.」的自动生成文件,所有修改在自定义业务代码中完成即可,操作步骤如下:
- 删除项目中手动实现的三个旧版无completion参数的冲突方法:
provideHeroOptionsCollection(for:)confirm(intent:)handle(intent:)
- 实现新版带completion回调参数的协议方法,将原有业务逻辑迁移到新方法中,方法签名参考如下:
// 英雄选项提供方法 func provideHeroOptionsCollection( for intent: DynamicCharacterSelectionIntent, with completion: @escaping (INObjectCollection<Hero>?, Error?) -> Void ) { // 迁移原有英雄列表加载逻辑,最终通过completion返回结果 let heroList = // 原有获取所有英雄对象的逻辑 completion(INObjectCollection(items: heroList), nil) } // Intent确认方法 func confirm( intent: DynamicCharacterSelectionIntent, completion: @escaping (DynamicCharacterSelectionIntentResponse) -> Void ) { // 迁移原有参数校验逻辑,最终通过completion返回确认结果 completion(.init(code: .success, userActivity: nil)) } // Intent处理方法 func handle( intent: DynamicCharacterSelectionIntent, completion: @escaping (DynamicCharacterSelectionIntentResponse) -> Void ) { // 迁移原有Widget跳转、数据传递逻辑,最终通过completion返回处理结果 guard let selectedHero = intent.hero else { completion(.init(code: .failure, userActivity: nil)) return } completion(.success(hero: selectedHero)) }
- 按下
Shift + Command + K清理Xcode构建缓存,重新编译项目,自动生成文件中的报错会自动消失。
注意:所有对Intent逻辑的修改都要在
.intentdefinition可视化配置文件和自定义的业务实现文件中操作,直接修改自动生成的Swift文件会在下次Intent定义变更时被Xcode覆盖,所有修改会丢失。
内容的提问来源于stack exchange,提问作者user14119170
相关产品推荐
相关产品推荐

