AuthDataResult类型无uid成员错误:iOS社交App开发求助
解决Firebase Auth错误:
Value of type 'AuthDataResult' has no member 'uid' 嘿,我来帮你搞定这个问题!这个错误其实是Firebase Auth API更新带来的小变化导致的,很容易修复。
问题根源
在旧版本的Firebase Auth中,signIn(withEmail:password:)的回调会直接返回User?类型的用户对象,但新版本里,回调参数变成了AuthDataResult?——这个对象是一个包装器,真正的用户实例藏在它的user属性里,所以你直接访问uid自然会报错。
修复步骤
只需要把你获取uid的代码,从user?.uid改成user?.user.uid就行。另外,你代码里标注了// Create Account的部分,如果之后要实现注册逻辑,也要注意同样的API变化:createUser(withEmail:password:)的回调参数也是AuthDataResult?,同样需要通过.user来拿到用户对象。
修改后的signInPressed方法代码如下:
@IBAction func signInPressed(_ sender: Any) { if let email = emailField.text, let password = passwordField.text { Auth.auth().signIn(withEmail: email, password: password) { (authResult, error) in if error != nil { // 顺便给你补全创建账户的示例,同样要注意AuthDataResult的用法 Auth.auth().createUser(withEmail: email, password: password) { (createResult, createError) in guard createError == nil else { print("创建账户失败:\(createError!.localizedDescription)") return } if let userID = createResult?.user.uid { KeychainWrapper.standard.set(userID, forKey: "uid") self.performSegue(withIdentifier: "toFeed", sender: nil) } } } else { if let userID = authResult?.user.uid { KeychainWrapper.standard.set(userID, forKey: "uid") self.performSegue(withIdentifier: "toFeed", sender: nil) } } } } }
额外小建议
你可以把回调参数的名字改成authResult(像我上面这样),这样能更直观地看出它的类型,避免和真正的用户对象混淆。另外,之后遇到Firebase相关的API问题,优先查官方最新文档,能少踩很多版本更新的坑。
内容的提问来源于stack exchange,提问作者Timothy Lie
相关产品推荐
相关产品推荐

