func doGetLocalDataUser() -> logInResponse {
var localData : logInResponse? = nil
if let userData = UserDefaults.standard
.data(forKey: ConstantStrings.KEY_USER_LOGIN_DATA),let user = try? JSONDecoder()
.decode(logInResponse.self ,from: userData){
localData = user
}
return localData!
}
我会将方法更改为:
func doGetLocalDataUser() -> logInResponse? {
guard let userData = UserDefaults.standard.data(forKey: ConstantStrings.KEY_USER_LOGIN_DATA), let user = try? JSONDecoder().decode(logInResponse.self ,from: userData) else {
return nil
}
return user
}
请记住,JSON解码可能会失败(可能格式错误(,因此用户将为nil,并且此方法可以返回nil
>localData
为零,因此您是非法强制解开localData
(作为logInResponse
(。
如果您的可选链接在任何时候找到nil
(例如,您的userData
在UserDefaults
/具有错误的类型中不存在(,则它不会执行。
声明此doGetLocalDataUser()
函数是为了返回非可选的logInResponse
类型,并强制解开nil
值以尝试检索该值。最佳做法是避免强制展开"砰"运算符"!
",因为它可能导致这样的致命错误。
简单的解决方案是更改方法以返回可选的 logInResponse?
类型,并消除 bang 运算符:
func doGetLocalDataUser() -> logInResponse? {
if let userData = UserDefaults.standard.data(forKey: ConstantStrings.KEY_USER_LOGIN_DATA), let user = try? JSONDecoder().decode(logInResponse.self ,from: userData){
return user
} else {
return nil
}
}