Swift在远程通知didReceive响应回调中调用方法报表达式歧义错误如何解决
问题排查与解决方案
报错根本原因
Type of expression is ambiguous without more context 报错是编译器无法完成参数类型推导导致的,具体触发原因有3个:
- 变量名大小写拼写错误:你定义的用户ID变量是
myID,调用sendNewMessage时错误写为小写的myId,二者不匹配 - 参数类型不匹配:从
userInfo中取出的字段默认是Any?可选类型,你的ApiService.sendNewMessage对应参数要求为String类型,未做类型转换直接传参会导致编译器无法识别参数类型 - 多处拼写笔误:方法名、系统类名、变量名存在多处拼写错误,进一步干扰编译器的类型校验逻辑
修复步骤
- 修正所有拼写错误
- 对从
userInfo取出的字段做可选绑定和类型强转,确保传入方法的参数类型和方法定义完全匹配 - 调用结束后记得执行通知的
completionHandler回调,避免系统抛出异常
修正后的代码示例
// 修正方法名、系统类名的拼写错误 func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { // 修正变量名拼写错误 let userInfo = response.notification.request.content.userInfo switch response.actionIdentifier { case Notifications.Actions.reply: let textResponse = response as! UNTextInputNotificationResponse let userText = textResponse.userText // 对userInfo取出的字段做类型校验和转换 guard let messageFrom = userInfo["from"] as? String, let myID = userInfo["to"] as? String else { completionHandler() return } // 修正变量名大小写错误,参数类型匹配方法要求 ApiService.sendNewMessage(myID, to: messageFrom, message: userText) { _ in // 网络请求完成后调用通知回调 completionHandler() } break default: completionHandler() } }
可选排查项
如果修复后仍有报错,可按住Option键点击sendNewMessage方法,核对方法的参数顺序、参数标签、每个参数的类型是否和调用时完全一致,排除方法重载导致的歧义。
内容的提问来源于stack exchange,提问作者Neglected Sanity
相关产品推荐
相关产品推荐

