You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用计算属性返回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
        }
    }
}

额外提醒

还有两个小细节要注意:

  1. UIAlertAction的style枚举没有.ok,正确的选项是.default、.cancel或.destructive,我已经在代码里修正了。
  2. 你原来用的form.rows.forEach里的return只会跳出当前的循环迭代,不会退出整个saveButtonPressed函数。如果想找到第一个未修改的行就弹窗并停止后续逻辑,用普通的for循环更合适,这和C里的for循环行为一致。

内容的提问来源于stack exchange,提问作者DannyBoi8181

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:38:35