SimpleStoreData 0.1.2

SimpleStoreData 0.1.2

Maintained by skytoup.



  • By
  • skytoup

SimpleStoreData

CI Status codecov.io Version Carthage compatible SPM License Platform

SimpleStoreData一个纯Swift的框架, 为了更简单、更结构化地存储和读写数据, 提供多种数据存储方式选择。

支持的存储方式

  • UserDefault
  • ...

支持的存储结构

  • Dictionary
  • Codable
  • ...

示例

请参考仓库的Example目录

使用要求

  • 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 Manager

在你的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 is available under the MIT license. See the LICENSE file for more info.