我的应用在登录时使用Google SDK收集用户名。这样可以无缝使用。但是,当我按下谷歌登录页面上的完成按钮时,我收到错误。 "致命错误:在打开可选值"
时意外发现nilfunc 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的帮助。谢谢:))
答案 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则不会通过该检查