iOS15 Swift Playgrounds中SwiftUI混用UIViewController编译卡顿求助
编译报错:无法构建应用,编译器无法检查错误的解决方法
问题现象
编译项目时持续加载,提示:无法构建应用,当前编译器无法检查错误,请尝试拆分为子表达式。
代码中的问题分析
你的代码存在两处关键错误,导致编译器无法正常解析:
语法错误:大括号未闭合
UIAlertAction的handler闭包缺少闭合的}viewDidAppear方法整体缺少闭合的}
这种语法不完整会让编译器陷入解析困境,出现你遇到的报错。
逻辑错误:错误的Alert调用位置
在"Done"按钮的回调中调用present(alert, animated: true)是错误的,此时Alert已经被展示,该操作会导致重复展示的问题,且违背逻辑流程。另外,DispatchQueue.main.asyncAfter在这里完全没有必要,回调本身就在主线程执行。
修正后的代码
struct ContentView: View{ var body: some View{ Controller() } } struct Controller: UIViewControllerRepresentable{ func makeUIViewController(context: Context) -> Contro { let viewController = Contro() //additional setup return viewController } func updateUIViewController(_ uiViewController: Contro, context: Context) { //update Content } } class Contro: UIViewController{ override func viewDidAppear(_ animated: Bool){ super.viewDidAppear(animated) // 调用父类生命周期方法 let alert = UIAlertController(title: "Rename Subject", message: "", preferredStyle: .alert) alert.addTextField{ value in value.placeholder = "subject name" value.returnKeyType = .continue } alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: { _ in self.dismiss(animated: true) })) alert.addAction(UIAlertAction(title: "Done", style: .default, handler: { _ in guard let fields = alert.textFields, fields.count == 1 else { self.dismiss(animated: true) return } guard let texts = fields[0].text, !texts.isEmpty else { self.dismiss(animated: true) return } UserDefaults.standard.set(texts, forKey: "RenamedSubjectName") self.dismiss(animated: true) })) present(alert, animated: true) // 将Alert展示逻辑移到正确位置 } }
额外优化说明
- 补充
super.viewDidAppear(animated):重写生命周期方法时必须调用父类实现,避免潜在的页面异常。 - 给Cancel按钮添加
dismiss:确保点击取消时Alert能正常关闭。 - 所有
guard分支添加dismiss:避免输入无效时Alert一直停留在界面上。
内容的提问来源于stack exchange,提问作者Yale Y
相关产品推荐
相关产品推荐

