当谷歌名称从可选值返回nil时,应用程序崩溃

时间:2017-05-08 19:19:26

标签: ios swift login

我的应用在登录时使用Google SDK收集用户名。这样可以无缝使用。但是,当我按下谷歌登录页面上的完成按钮时,我收到错误。 "致命错误:在打开可选值"

时意外发现nil
func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) {


nameString = user.profile.name


defaults.set(nameString, forKey: "userName")
defaults.set(user.profile.email, forKey: "email")
defaults.set(user.profile.imageURL(withDimension: 50)!, forKey: "image")

print("email: \(user.profile.email!)")
print("name: \(user.profile.name!)")
print("lastname: \(user.profile.familyName!)")
print("lastname: \(user.profile.imageURL(withDimension: 50))")


self.dismiss(animated: true, completion: nil)
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "UserLoggedIn"), object: nil)

所以这是我用来接收名字并通过userDeafaults保存它们的功能。

实际问题是这条线 " nameString = user.profile.name" 因为当您在登录屏幕上完成新闻时,您正在跳过登录。这导致它不会从user.profile.name接收任何数据。

我怎么能解决这个问题?因此,如果user.profile.name不包含任何内容,则不会将名称保存为namestring。

非常感谢som的帮助。谢谢:))

1 个答案:

答案 0 :(得分:0)

你必须检查nameString是否为nil,以便在if let语句中安全地解包它

if let nameString = user?.profile.name {
    // here your safe to use the nameString it check's if it's not nil
    defaults.set(nameString, forKey: "userName")
} 

或者@vacawama说你可以用一个guard语句检查字符串是不是nil。但是有了警卫声明,你必须记住你必须返回。这意味着如果name为nil,它将会失效。

还有另一种检查字符串是否包含字符的方法。如何检查您可以在此处阅读的内容extending Strings extension

如何使用后卫打开它

guard let nameString = nameString else { return }

如果你不想使用看守,或者如果你想让你可以直接检查nameString是不是空的

guard nameString != nil  else {
        return
}

在这个警卫检查之后,您可以强制打开nameString,因为如果nameString为nil则不会通过该检查