2017-05-08 26 views
0

我的應用程序正在使用Google SDK在登錄時收集用戶名。這可以無縫工作。但是,當我按下谷歌登錄頁面上的完成按鈕時,我收到錯誤消息。 「致命錯誤:展開一個可選的值時,意外地發現無」當谷歌名稱從可選值返回零時,應用程序崩潰

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的幫助。謝謝:)

+0

你想要做的時候'user'是什麼做'ñ il'? – vacawama

+0

什麼也沒有,只需回到開始屏幕 –

+0

在'nameString = ...'行之前添加一個警戒語句:'guard let user = user else {return}'。 – vacawama

回答

0

你必須檢查nameString不是零安全地拆開包裝它的,如果讓語句

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說,你可以使用保護語句來檢查字符串不是零。但有了警戒聲明,你必須記住你必須回來。這意味着,如果名字是零,它將打破功能。

還有另一種方法來檢查您的字符串是否包含字符。如何檢查那些你可以在這裏閱讀更多extending Strings extension

如何使用後衛

guard let nameString = nameString else { return } 

解開它,如果你不想使用保護我們,或者讓用戶可以直接檢查nameString不空

guard nameString != nil else { 
     return 
} 

後該保護檢查你可以強制拆禮物nameString因爲如果nameString是零,你將無法通過該檢查

+0

Thx :)但是,嗯,它仍然給出了同樣的錯誤:/你會怎麼寫衛隊更準確? –

+0

你可以用不同的方式使用後衛我將編輯我的答案,我也會加入後衛 –

+0

太好了,謝謝! –

相關問題