開發(fā)中經(jīng)常會用到UserDefault來存儲零碎的數(shù)據(jù), 用普通的寫法比較低效.
let uid = UserDefaults.standard.value(forKey: "userdefault.key.uid") as? Int
可以利用Swift的extension
來給Int類型添加便捷的函數(shù):
extension Int {
static func valueFromUserDefault(forKey key: String) -> Int? {
return UserDefaults.standard.value(forKey: key) as? Int
}
}
let uid = Int.valueFromUserDefault(forKey: "userdefault.key.uid")
而實(shí)際上, UserDefault存儲的數(shù)據(jù)類型還有好幾種, 而實(shí)現(xiàn)代碼其實(shí)都是大同小異, 要每一個都這樣添加函數(shù)就太麻煩了.
有一種更高效的方式給各種類型添加這個函數(shù), 而且也方便統(tǒng)一修改. 就是用泛型和Protocol:
public protocol UserDefaultable {
associatedtype E
static func objectUserDefaults(forKey key: String) -> E?
}
extension UserDefaultable {
public static func valueFromUserDefaults(forKey key: String) -> E? {
return UserDefaults.standard.value(forKey: key) as? E
}
}
這樣只要聲明了遵守UserDefaultable的類型都可以使用valueFromUserDefaults
靜態(tài)函數(shù), 很自然, 這個associatedtype E
就是綁定這個類型本身.
extension Bool: UserDefaultable {
public typealias E = Bool
}
extension Int: UserDefaultable {
public typealias E = Int
}
extension Int32: UserDefaultable {
public typealias E = Int32
}
extension Int64: UserDefaultable {
public typealias E = Int64
}
extension String: UserDefaultable {
public typealias E = String
}
extension Double: UserDefaultable {
public typealias E = Double
}
extension Data: UserDefaultable {
public typealias E = Data
}
extension Array: UserDefaultable {
public typealias E = Array
}