无法转换价值类型"用户?"预期参数类型"用户!"

时间:2017-08-01 05:46:10

标签: ios swift firebase swift3 firebase-authentication

我刚刚在Firebase的Xcode项目中升级了pod文件,它显示了一堆错误。注册用户时,我收到错误Cannot convert value type "User?" to expected argument type "User!"

我不确定问题是什么。我尝试更改一些可选值以使其正常工作,但我似乎并不清楚问题是什么。

这是我遇到错误的函数:

代码已使用我的问题解决方案

进行了修改
import Firebase
// Sign Up Function
func signUp(username: String, name: String, email: String, password: String){

    Auth.auth().createUser(withEmail: email, password: password, completion: { (user, error) in
        if error == nil {
            self.setUserInfo(user: user, username: username, name: name, email: email, password: password)

        }
        else{
            print(error?.localizedDescription as Any)
        }
    })

}

// Set the user info to Firebase storage. username, and password
private func setUserInfo(user: Firebase.User!, username: String, name: String, email: String, password: String){

       if error == nil {
           self.saveUserInfo(user: user, username: username, name: name, password: password)
       }
       else{
           print(error?.localizedDescription as Any)
       }
}

修改 正如用户ryanwils所提到的,无论我在哪里使用FIRUser都需要替换为Firebase.User

以下是迁移指南的链接,进一步解释了这一点:https://firebase.google.com/docs/reference/ios/naming-migration-guide

请注意,代码已更新,因此截至编辑当天未发出任何错误

3 个答案:

答案 0 :(得分:7)

新的Firebase版本在大多数类型上删除了FIR前缀,因此现在FIRUser被称为User。您的应用中是否已经有User结构或类?如果是,您需要更改setUserInfo来电中的参数,接受Firebase.User(通知否!),而不是User!

然后,当您调用它时,您可以使用if letguard let抓取它,或在传递时用user!强行打开它。

如果情况不是这样,请告诉我,我可以尝试进一步提供帮助!

修改:包含指向所有必要更改的Firebase 4 Swift Migration Guide链接。

答案 1 :(得分:1)

在firebase完成处理程序中,User对象是可选的,但在您的方法中,您需要非可选的User对象。您可以修复它:

// Sign Up Function
func signUp(username: String, name: String, email: String, password: String
{
    Auth.auth().createUser(withEmail: email, password: password, completion: { (user, error) in
        if error == nil && user != nil
        {
            // error happens here
            self.setUserInfo(user: user!, username: username, name: name, email: email, password: password)

        }
        else
        {
            print(error?.localizedDescription as Any)
        }
    })
}

// Set the user info to Firebase storage. Profile picture change, username, and password
private func setUserInfo(user: User, username: String, name: String, email: String, password: String)
{
    if error == nil
    {
        self.saveUserInfo(user: user, username: username, name: name, password: password)
    }
    else
    {
        print(error?.localizedDescription as Any)
    }
}

答案 2 :(得分:1)

鉴于收到的错误为零,您在完成版块中收到 用户 。所以基本上检索的用户的类型是可选的。

private func setUserInfo(user: User?, username: String, name: String, email: String, password: String){
    if error == nil && user != nil
     {
       self.saveUserInfo(user: user!, username: username, name: name, password: password)
      } else {

       print(error?.localizedDescription as Any)
}