Swift UserDefaults необязательно Int - PullRequest
0 голосов
/ 08 мая 2019

Я хочу установить или получить значение из UserDefaults, которое является необязательным Int, что означает, что это либо ноль, либо значение.Я в замешательстве, однако.В приведенном ниже коде я установил его как ноль или целое число.Я не уверен, что это правильно.Есть ли лучший или более чистый способ (при условии, что все, что я делаю, правильно)?

public var selectedOption:myOption? {
    get {
        if let opt = UserDefaults.standard.object(forKey: "myKey") as? Int {
            if let val = myOption(rawValue: opt) {
                return val
            }
        }

        return nil
    }

    set {
        if let newVal = newValue {
            UserDefaults.standard.set(newVal.rawValue, forKey:"myKey")
        } else {
            UserDefaults.standard.set(nil, forKey:"myKey")
        }

    }
}

Ответы [ 2 ]

2 голосов
/ 08 мая 2019

Вы можете уменьшить значение установщика

set {
    UserDefaults.standard.set(newValue?.rawValue, forKey:"myKey")
}

Из-за дополнительной цепочки выдается nil, если newValue равно nil.

0 голосов
/ 08 мая 2019
public var selectedOption:myOption? {
    get {
        if let opt = UserDefaults.standard.object(forKey: "myKey") as? Int {
            return myOption(rawValue: opt)
        }
        return nil
    }
    set {
        UserDefaults.standard.set(newValue?.rawValue, forKey: "myKey")
    }
}

Или

Подтвердите кодируемый протокол и сохраните экземпляр enum в UserDefaults

enum myOption: Int, Codable {
    case a
    case b
}

public var selectedOption1:myOption? {
    get {
        if let storedObject: Data = UserDefaults.standard.object(forKey: "myKey") as? Data {
            return try? PropertyListDecoder().decode(myOption.self, from: storedObject)
        }
        return nil
    }
    set {
        UserDefaults.standard.set(try? PropertyListEncoder().encode(newValue), forKey: "myKey")
    }
}
...