SimpleStoreData 0.1.2

SimpleStoreData 0.1.2

skytoup 维护。



  • skytoup

SimpleStoreData

CI Status codecov.io Version Carthage compatible SPM License Platform

SimpleStoreData是一个纯Swift的框架,旨在提供多种数据存储方式,以更简单、更结构化的方式存储和读写数据。

支持的存储方式

  • 用户默认设置
  • ...

支持的存储结构

  • 字典
  • 可编码
  • ...

示例

请参考仓库的示例目录

使用要求

  • Swift
    • 5.1
    • 5.2
    • ...
  • iOS 9.0+(可能更低,但尚未测试)
  • macOS 10.13+(可能更低,但尚未测试)
  • watchOS 5.0+(可能更低,但尚未测试)
  • tvOS(尚未测试)

安装

Cocoapods

在你的Podfile文件中添加

pod 'SimpleStoreData', '0.1.2'

Carthage

在您的Cartfile文件中添加

github "skytoup/SimpleStoreData" ~> 0.1.2

Swift 包管理器

在您的 Package.swift 文件中,将其添加到 dependencies 部分

.package(url: "https://github.com/skytoup/SimpleStoreData", .upToNextMajor(from: "0.1.2"))

用法

基本使用

场景: 存储登录用户的数据(存储到UserDefault)

Example/Example/main.swift

CodableDictStoreItem、CodableDataStoreItem、StoreKeychain这里就不演示, 请到上面的文件查看具体用法

定义一个用户性别的枚举, 因为UserDefault不支持直接存储enum, 所以需要实现UDCoding

UserDefault支持的存储类型

  • String
  • Int
  • Float
  • Double
  • Bool
  • Data
  • Date
  • URL
enum Gender: Int {
    case unknown = 0
    case male
    case female
}
/// 对于`UserDefault`不支持的存储类型提供数据转换
extension Gender: UDCoding {
    func toUDAny() -> Any {
        rawValue
    }
    
    static func fromUDAny(_ any: Any?) -> Gender? {
        guard let any = any as? Int else {
            return nil
        }
        return Gender(rawValue: any)
    }
}

定义存储用户数据的字段(重点提示: StoreItem必须使用struct实现), 字段使用UDMapperParam属性包装定义, 再实现mapValue方法进行数据映射

/// **重点提示: StoreItem必须使用struct实现**
struct UserStoreItem: UDMapperStoreItem {
    @UDMapperParam(key: "name", default: "") var name
    @UDMapperParam(key: "age", default: 0) var age
    @UDMapperParam(key: "gender", default: Gender.unknown) var gender
    
    mutating func mapValue<Mapper>(_ mapper: inout Mapper) where Mapper : DictMapper, UserStoreItem.Key == Mapper.Key, UserStoreItem.Value == Mapper.Value {
        mapper <- _name
        mapper <- _age
        mapper <- _gender
    }
}

定义管理StoreItem的管理类(此处简单使用单例, 可根据自己的业务进行调整, manager也可定义更多业务方法)

class UserManager: StoreDictUD<UserStoreItem> {
    static let shared = UserManager(udKey: "__User__")
    
    // 这里可以添加一些业务方法
}

使用演示, 修改item数据即可存自动储, 无需其它调用方法

var userM = UserManager.shared
// 清空之前的数据
userM.ud.set(nil, forKey: userM.udKey)

// 提示: 一次性更新多个字段最好是使用方法`batchUpdate`
userM[\.name] = "sky"
print("第一次修改 \(userM.ud.dictionary(forKey: userM.udKey) ?? [:])")
// 第一次修改 ["gender": 0, "age": 0, "name": sky]

userM[\.age] = 18
print("第二次修改 \(userM.ud.dictionary(forKey: userM.udKey) ?? [:])")
// 第二次修改 ["name": sky, "age": 18, "gender": 0]

userM[\.gender] = .male
print("第三次修改 \(userM.ud.dictionary(forKey: userM.udKey) ?? [:])")
// 第三次修改 ["age": 18, "name": sky, "gender": 1]


// 批量修改字段再存储
userM.batchUpdate { item in
    item.name = "yks"
    item.age = 81
    item.gender = .female
}
print("batchUpdate \(userM.ud.dictionary(forKey: userM.udKey) ?? [:])")
// batchUpdate ["age": 81, "name": yks, "gender": 2]

// 相当于重置数据
userM.item = UserStoreItem()
print("重置数据 \(userM.ud.dictionary(forKey: userM.udKey) ?? [:])")
// 重置数据 ["age": 0, "name": , "gender": 0]

Store的PropertyWrapper用法

详细信息请参考Example/Example/main.swift

/// 使用`PropertyWrapper`特性`StoreUDW`实现自己的`class`或`struct`一次性包含多个`StoreItem`
class AppManager {
    static let shared = AppManager()
    
    @StoreDictUDW<UserStoreItem>(udKey: "__AppUser__") var user
    @StoreDictUDW<SettingStoreItem>(udKey: "__AppSetting__") var setting
}

开源协议(MIT)

SimpleStoreData遵循MIT许可协议。有关更多信息,请参阅LICENSE文件。