当前位置: 首页 > news >正文

小知识三、USerDefault我换个姿势来实现

像往常一样,用字符串当key 缺点:

  • 容易拼写错误
  • 重复定义
  • 多人开发项目,难于管理

eg:

import Foundation
import UIKit

protocol UserDefaultNameSpace {}

extension UserDefaultNameSpace {
    static func namespace<T>(_ key:T) -> String where T: RawRepresentable {
        return "\(Self.self).\(key.rawValue)"
    }
}

protocol UserDefaultSettable: UserDefaultNameSpace {
    associatedtype UserDafaultKey: RawRepresentable
}

extension UserDefaultSettable where UserDafaultKey.RawValue == String {}

extension UserDefaultSettable {
    /// 关于 Int 类型的存储和读取
    static func set(value: Int, forKey key: UserDafaultKey) {
        let key = namespace(key)
        UserDefaults.standard.set(value, forKey: key)
        
    }
    
    static func integer(value: Int, forKey key: UserDafaultKey) {
        let key = namespace(key)
        UserDefaults.standard.integer(forKey: key)
    }
    
    /// 关于 String 类型存储和读取
    static func set(value: Any?, forKey key: UserDafaultKey) {
        let key = namespace(key)
        UserDefaults.standard.set(value, forKey: key)
    }
    
    static func string(value: Any?, forKey key: UserDafaultKey) {
        let key = namespace(key)
        UserDefaults.standard.string(forKey: key)
    }
}

// MARK: - 使用方式
extension UserDefaults {
    struct Account: UserDefaultSettable {
        enum  UserDafaultKey: String {
            case name
            case age
            case birth
        }
    }
}

class test {
    func testFunction() {
        UserDefaults.Account.set(value: 20, forKey: .age)
        UserDefaults.Account.set(value: "hjq", forKey: .name)
    }

}
复制代码

相关文章:

  • 581 Shortest Unsorted Continuous Subarray
  • v4l2 Camera详细设置【转】
  • iOS核心动画高级技术(十三) 高效绘图
  • ant任务调用和参数传递
  • 好玩的 RAC
  • Matlab2013a许可证过期问题,反复提示激活
  • 北京司法网拍首尝线下预展 海淀法院900万红木家具亮相京东秋拍
  • java进阶-常用数据结构以及算法思想
  • Nginx服务状态的监控
  • spring cloud Dalston.SR4 feign 实际开发中踩坑(二)
  • Kibana插件sentinl实现邮件报警
  • Vue slot分发内容
  • 前端面试总结(at, md)
  • Webpack入门之遇到的那些坑,系列示例Demo
  • Unity 微型调试器 Debugger
  • python3.6+scrapy+mysql 爬虫实战
  • 5、React组件事件详解
  • avalon2.2的VM生成过程
  • java取消线程实例
  • JDK 6和JDK 7中的substring()方法
  • js ES6 求数组的交集,并集,还有差集
  • js算法-归并排序(merge_sort)
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • mysql 数据库四种事务隔离级别
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Redash本地开发环境搭建
  • Spring框架之我见(三)——IOC、AOP
  • Vue 重置组件到初始状态
  • vuex 笔记整理
  • 包装类对象
  • 浮现式设计
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 计算机在识别图像时“看到”了什么?
  • 近期前端发展计划
  • 前端_面试
  • 深度学习入门:10门免费线上课程推荐
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 线上 python http server profile 实践
  • 用Canvas画一棵二叉树
  • python最赚钱的4个方向,你最心动的是哪个?
  • 如何正确理解,内页权重高于首页?
  • 整理一些计算机基础知识!
  • #Lua:Lua调用C++生成的DLL库
  • $L^p$ 调和函数恒为零
  • (6)STL算法之转换
  • (C语言)球球大作战
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (二)springcloud实战之config配置中心
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (七)Knockout 创建自定义绑定
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • .md即markdown文件的基本常用编写语法