Добавим несколько шагов, чтобы понять:
UserDefaults.standard.value(forKey: UserDefaultKeys.profilePodSN) as? String
=>
let podSNFromUserDefaults = UserDefaults.standard.value(forKey: UserDefaultKeys.profilePodSN)
let podSNAsString = podSNFromUserDefaults as? String
Ну, вы увидите, что podSNFromUserDefaults
это не nil
, это podSNAsString
который.Зачем ?Потому что podSNFromUserDefaults
это Int
/ NSNumber
, а не String
.Вы не можете разыграть это как String
как этот.Используйте String(myInt)
.
И так как мы уже знаем, что это Int, как вы делали для каждого отдельного вызова, используйте integer(forKey:)
, и непосредственно string(forKey:)
также для profileEmail
, вам не нужноas? String
впоследствии.
var userProfile: (email: String?, podSn: String?, podId: String?)
{
get {
return (UserDefaults.standard.string(forKey: UserDefaultKeys.profileEmail),
String(UserDefaults.standard.integer(forKey: UserDefaultKeys.profilePodSN)),
String(UserDefaults.standard.integer(forKey: UserDefaultKeys.profilePodID))
}
}
Примечание:
Вы должны избавиться от UserDefaults.standard.synchronize()
.
Совет:
Если у вас есть проблемы, незабудьте разбить несколько звонков, сделанных в одной строке, на разные.Тогда будет проще отладить, какой именно шаг не работает.