Swift之优雅安全访问UserDefaults

在Swift中为了安全考虑,引入了Optional的类型, 但是在使用的时候可能需要获取到非Optional的值,如下

UserDefaults.standard.set("hello", forKey: "ly-test-key")
let str1 = UserDefaults.standard.string(forKey: "ly-test-key")
print(str1) // Optional("hello")

上面的代码中, 每次从UserDefautls获取string的时候得到的可能是nil或者存储的string值hello, 有时候还要考虑处理掉字符串中的optional描述或者将一个String?赋值给String类型的时候还要在处理。 还有另外一个考虑,就是UserDefaults的key值在swift中可以更加优雅的处理,而不必像Objective-C或其他语言那样定义一个普通的String常量。 下面直接上Swift代码

class DefaultKeys {
    fileprivate init() { }
}

class DefaultKey: DefaultKeys {
    public let key: String
    
    init(_ key: String) {
        self.key = key
    }
}

extension UserDefaults {
    subscript(key: DefaultKey) -> Int {
        set {
            set(newValue, forKey: key.key)
        }
        get {
            return integer(forKey: key.key)
        }
    }
    
    subscript(key: DefaultKey) -> Int64 {
        set {
            set(NSNumber(value: newValue), forKey: key.key)
        }
        get {
            if let number = self.value(forKey: key.key) as? NSNumber {
                return number.int64Value
            }
            return 0
        }
    }
    
    subscript(key: DefaultKey) -> String {
        set {
            set(newValue, forKey: key.key)
        }
        get {
            return string(forKey: key.key) ?? ""
        }
    }
    
    subscript(key: DefaultKey) -> String? {
        set {
            set(newValue, forKey: key.key)
        }
        get {
            return string(forKey: key.key)
        }
    }
    
    subscript(key: DefaultKey<[Any]>) -> [Any] {
        set {
            set(newValue, forKey: key.key)
        }
        get {
            return array(forKey: key.key) ?? []
        }
    }
    
    subscript(key: DefaultKey<[Any]?>) -> [Any]? {
        set {
            set(newValue, forKey: key.key)
        }
        get {
            return array(forKey: key.key)
        }
    }
    
    subscript(key: DefaultKey<[String: Any]>) -> [String: Any] {
        set {
            set(newValue, forKey: key.key)
        }
        get {
            return dictionary(forKey: key.key) ?? [:]
        }
    }
    
    subscript(key: DefaultKey<[String: Any]?>) -> [String: Any]? {
        set {
            set(newValue, forKey: key.key)
        }
        get {
            return dictionary(forKey: key.key)
        }
    }
    
    subscript(key: DefaultKey) -> Bool {
        set {
            set(newValue, forKey: key.key)
        }
        get {
            return bool(forKey: key.key)
        }
    }
}

那么如何使用呢?


let lyUserDefault = UserDefaults.standard

extension DefaultKeys {
    static let test = DefaultKey("ly-test-key")
}

// 之前的方式示例
UserDefaults.standard.set("hello", forKey: "ly-test-key")
let str1 = UserDefaults.standard.string(forKey: "ly-test-key")
print(str1) // Optional("hello")


// 新的Swift实现
lyUserDefault[.test] = "world"
let str2 = lyUserDefault[.test] // string
print(str2) // world

怎么样? 是不是更加的优雅和nil安全呢?

 

你可能感兴趣的:(Swift之优雅安全访问UserDefaults)