升级Xcode 13后SwiftUI生命周期项目出现编译错误如何解决
问题解决方案
第一步:解决文件不可编辑问题
这些报错文件属于你通过包管理工具引入的第三方依赖,不属于项目本地源码,因此无法直接在Xcode中修改,按依赖类型处理即可:
- 如果是CocoaPods引入:优先将对应依赖升级到已兼容Xcode13的正式版本;如果依赖不再维护,可以fork原仓库修改后在Podfile中指向你的fork地址,或使用post_install钩子在依赖安装时自动注入修改代码
- 如果是SPM/Carthage引入:同样优先升级依赖到官方兼容Xcode13的版本,或修改依赖源为你调整后的兼容分支
第二步:修复Missing argument for parameter 'rootView' in call报错
Xcode13升级后,SwiftUI的UIHostingController移除了无参数默认构造器,必须显式传入rootView参数,修改逻辑如下:
- 在
_AppKitOrUIKitViewControllerLifecycleEventView结构体中新增存储属性接收rootView:
let rootView: Content
- 补充结构体的自定义构造方法,接收外部传入的Content实例
- 修改
makeUIViewController方法中的初始化代码:
func makeUIViewController(context: Context) -> UIViewControllerType { UIViewControllerType(rootView: rootView) }
第三步:修复Contextual closure type '(type1,type2) -> RowContent' expects 2 arguments, but 1 was used in closure body报错
Xcode13中SwiftUI原生List的多选初始化方法签名发生变更,对应的rowContent闭包现在默认传入2个参数,你只需显式忽略第二个未使用的参数即可,两处报错的初始化代码修改如下:
第一处:
self.init(data, selection: selection, rowContent: { element, _ in rowContent(element, selection.wrappedValue.contains(element.id)) })
第二处:
self.init(data, selection: selection, rowContent: { element, _ in rowContent(element, selection.wrappedValue.contains(element)) })
第四步:修复Command CompileSwift failed with a nonzero exit code报错
该报错属于前面语法错误引发的连锁编译失败,完成上述修改后执行以下操作即可:
- 按
Shift + Command + K清空Xcode构建缓存 - 手动删除
~/Library/Developer/Xcode/DerivedData路径下的对应项目缓存文件夹 - 重启Xcode后重新编译项目
内容的提问来源于stack exchange,提问作者nickcoding2
相关产品推荐
相关产品推荐

