使用计算属性返回UIAlertController遇类型转换错误求助
解决UIAlertController闭包类型不匹配的问题
嘿,刚从C转iOS开发遇到这个问题很正常,我来帮你拆解一下错误原因和修复方法~
错误根源
你这里把displayErrorController声明为UIAlertController类型,但右边赋值的是一个未执行的闭包(就是包裹着弹窗创建代码的{ ... }块)。在Swift里,这种未执行的闭包类型是() -> UIAlertController(表示“一个不需要参数、返回UIAlertController的函数”),而你要的是UIAlertController实例本身,所以编译器就报错说“无法把闭包类型转换成UIAlertController”。
两种修复方案
方案1:立即执行闭包
在闭包的末尾加上(),让闭包立刻运行并返回弹窗实例,这样赋值给变量的就是正确的类型了:
@objc func saveButtonPressed(_ sender: UIBarButtonItem){ // 闭包末尾加(),立即执行得到UIAlertController实例 let displayErrorController: UIAlertController = { let controller = UIAlertController(title: "Field not valid !", message: "Please fill out form", preferredStyle: .alert) // 注意:UIAlertAction的style没有.ok,正确枚举值是.default controller.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) return controller }() // 这里建议用for循环代替forEach,因为forEach里的return不会退出整个函数 for row in form.rows { if !row.wasChanged { self.present(displayErrorController, animated: true, completion: nil) return } } }
方案2:直接创建实例(更简单)
如果不需要延迟创建弹窗(比如只有用到的时候才创建),直接去掉闭包,直接初始化弹窗就行,代码更直观:
@objc func saveButtonPressed(_ sender: UIBarButtonItem){ let displayErrorController = UIAlertController(title: "Field not valid !", message: "Please fill out form", preferredStyle: .alert) displayErrorController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) for row in form.rows { if !row.wasChanged { self.present(displayErrorController, animated: true, completion: nil) return } } }
额外提醒
还有两个小细节要注意:
UIAlertAction的style枚举没有.ok,正确的选项是.default、.cancel或.destructive,我已经在代码里修正了。- 你原来用的
form.rows.forEach里的return只会跳出当前的循环迭代,不会退出整个saveButtonPressed函数。如果想找到第一个未修改的行就弹窗并停止后续逻辑,用普通的for循环更合适,这和C里的for循环行为一致。
内容的提问来源于stack exchange,提问作者DannyBoi8181
相关产品推荐
相关产品推荐

