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
相关产品推荐
相关产品推荐

