美文网首页swift学习
Swift泛型应用, UserDefault

Swift泛型应用, UserDefault

作者: 奥利奥_2aff | 来源:发表于2019-03-31 20:56 被阅读0次

    开发中经常会用到UserDefault来存储零碎的数据, 用普通的写法比较低效.

    let uid = UserDefaults.standard.value(forKey: "userdefault.key.uid") as? Int
    

    可以利用Swift的extension来给Int类型添加便捷的函数:

    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")
    

    而实际上, UserDefault存储的数据类型还有好几种, 而实现代码其实都是大同小异, 要每一个都这样添加函数就太麻烦了.
    有一种更高效的方式给各种类型添加这个函数, 而且也方便统一修改. 就是用泛型和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静态函数, 很自然, 这个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
    }
    

    相关文章

      网友评论

        本文标题:Swift泛型应用, UserDefault

        本文链接:https://www.haomeiwen.com/subject/gnzubqtx.html