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

Swift 3报错:抛出函数类型无法转换为非抛出函数类型求助

解决Swift中WebSocket闭包的抛出函数类型不匹配问题

嘿,刚接触Swift遇到这种类型错误太正常了,我来帮你拆解清楚问题:

错误根源

你看到的Invalid conversion from throwing function of type '(_) throws -> ()' to non-throwing function type '(Any) -> ()',本质是闭包类型不兼容:

  • self.ws.event.message要求的是一个不会向外抛出异常的闭包(类型为(Any) -> ())
  • 但你在闭包里直接用了try JSONSerialization.jsonObject(...)——这个方法本身会抛出解析异常,导致你的闭包变成了(_) throws -> ()类型(带抛出能力的函数),两者无法直接赋值。

另外还要提个小细节:JSONSerialization.jsonObject(with:)需要的是Data类型参数,你直接传String是不合法的,得先把字符串转成Data才行。

两种实用解决方案

方案1:用do-catch捕获异常(推荐,能明确处理错误)

把try放在do代码块里,用catch捕获解析时可能出现的错误,这样闭包就不会向外抛出异常了,同时还能清晰处理错误场景:

self.ws.event.message = { message in
    if let text = message as? String {
        // 先把字符串转成Data,做安全校验
        guard let data = text.data(using: .utf8) else {
            print("无法将字符串转换为Data格式")
            return
        }
        
        do {
            // 尝试解析JSON,捕获可能的错误
            let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
            print("recv: \(text)")
            // 这里可以添加对解析后json的后续处理逻辑
        } catch {
            print("JSON解析失败:\(error.localizedDescription)")
        }
    }
}

方案2:用try?将异常转为可选值(简洁但错误信息模糊)

如果不需要详细追踪错误原因,只是想忽略解析失败的情况,可以用try?——它会把抛出的异常自动转为nil,这样闭包也不会向外抛出:

self.ws.event.message = { message in
    if let text = message as? String,
       let data = text.data(using: .utf8),
       let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
        print("recv: \(text)")
        // 处理解析完成的json数据
    } else {
        print("数据格式错误或JSON解析失败")
    }
}

避坑提醒

  • 绝对别用try!,它会强制忽略所有异常,一旦解析失败会直接导致程序崩溃,非常不安全。
  • 处理WebSocket消息时,尽量对每个数据转换步骤做安全校验(比如guard let/if let),避免因为后端返回格式不符合预期导致崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:11:19