Почему один из этих геттеров / сеттеров работает, а остальные нет - PullRequest
0 голосов
/ 22 марта 2019

У меня есть класс, который имеет 2 набора методов получения и установки.1 комплект - традиционный тип.Они работают, как и ожидалось:

var userEmail : String
{
    get {
        return UserDefaults.standard.string(forKey: UserDefaultKeys.profileEmail) ?? ""
    }
    set (newValue) {
        UserDefaults.standard.set(newValue, forKey: UserDefaultKeys.profileEmail)
        UserDefaults.standard.synchronize()
    }
}

var podSerialNum : Int
{
    get {
        return UserDefaults.standard.integer(forKey: UserDefaultKeys.profilePodSN)
    }
    set (newValue) {
        UserDefaults.standard.set(newValue, forKey: UserDefaultKeys.profilePodSN)
        UserDefaults.standard.synchronize()
    }
}
var podID : Int
{
    get {
        return UserDefaults.standard.integer(forKey: UserDefaultKeys.profilePodID)
    }
    set (newValue) {
        UserDefaults.standard.set(newValue, forKey: UserDefaultKeys.profilePodID)
        UserDefaults.standard.synchronize()
    }
}

Другой получает / устанавливает все свойства одновременно.

var userProfile: (email:String?, podSn:String?, podId:String?)
{
    get {
        return ( UserDefaults.standard.value(forKey: UserDefaultKeys.profileEmail) as? String,
                 UserDefaults.standard.value(forKey: UserDefaultKeys.profilePodSN) as? String,
                 UserDefaults.standard.value(forKey: UserDefaultKeys.profilePodID) as? String)
    }
    set {
        UserDefaults.standard.set(newValue.email,   forKey: UserDefaultKeys.profileEmail)
        UserDefaults.standard.set(newValue.podSn,     forKey: UserDefaultKeys.profilePodSN)
        UserDefaults.standard.set(newValue.podId,   forKey: UserDefaultKeys.profilePodID)

        UserDefaults.standard.synchronize()
    }
}

userProfile.podSn всегда возвращает ноль.Однако userProfile.email & userProfile.podId работают как положено.Также работает прямой геттер (podSerialNum).

Что мне не хватает?

1 Ответ

1 голос
/ 26 марта 2019

Добавим несколько шагов, чтобы понять:

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().

Совет:
Если у вас есть проблемы, незабудьте разбить несколько звонков, сделанных в одной строке, на разные.Тогда будет проще отладить, какой именно шаг не работает.

...