使用GIDSignIn时遇“表达式类型模糊”错误求解决方案
解决Firebase Google Sign-In的“Type of expression is ambiguous without more context”错误
问题原因
这个错误是Swift类型推断失败导致的——代码中GIDSignIn.sharedInstance.signIn方法的闭包参数类型、getRootViewController()的返回类型没有明确指定,编译器无法确定表达式的具体类型。
解决方案
1. 明确闭包参数类型
修改报错位置的代码,给闭包的user和error参数指定具体类型,帮助编译器完成类型推断:
// 原报错代码 GIDSignIn.sharedInstance.signIn(with: config, presenting: getRootViewController()) { user, error in // 修改后 GIDSignIn.sharedInstance.signIn(with: config, presenting: getRootViewController()) { (user: GIDGoogleUser?, error: Error?) in // 原有逻辑保持不变 if let error = error { return } guard let authentication = user?.authentication, let idToken = authentication.idToken else { return } let credential = GoogleAuthProvider.credential(withIDToken: idToken, accessToken: authentication.accessToken) // 补充Firebase认证逻辑(可选,完成登录流程需要) Auth.auth().signIn(with: credential) { authResult, error in if let error = error { // 处理认证错误 return } // 登录成功后的逻辑 } }
2. 确保getRootViewController()返回明确类型
如果getRootViewController()是自定义方法,需确保它返回明确的UIViewController类型而非可选值,标准实现示例:
func getRootViewController() -> UIViewController { guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene, let rootVC = windowScene.windows.first?.rootViewController else { return UIViewController() } return rootVC }
补充说明
作为Firebase新手,这类类型推断错误很常见,通过明确指定参数/返回值类型即可解决。另外,拿到Google认证凭证credential后,需要调用Auth.auth().signIn(with:)完成Firebase侧的用户认证,才能真正完成登录流程。
内容的提问来源于stack exchange,提问作者KodeKat
相关产品推荐
相关产品推荐

