[Swift中安全优雅的使用UserDefaults](https://www.jianshu.com/p/3796886b4953)

因为在CC项目中需要使用到UserDefaults来存储是否开启了iCloud同步以及作为数据缓存的地方,防止在网络访问有误的情况下,出现数据加载不出来而导致无法使用的情况。

//
//  UserDefaultHelper.swift
//  clib
//
//  Created by 周椿杰 on 2019/3/29.
//  Copyright © 2019 周椿杰. All rights reserved.
//

protocol UserDefaultsSettable {
    associatedtype defaultKeys: RawRepresentable
}

extension UserDefaultsSettable where defaultKeys.RawValue==String {
    
    static func setString(value: String?, forKey key: defaultKeys) {
        let aKey = key.rawValue
        UserDefaults.standard.set(value, forKey: aKey)
    }
    static func setBool(value: Bool?, forKey key: defaultKeys) {
        let aKey = key.rawValue
        UserDefaults.standard.set(value, forKey: aKey)
    }
    static func setArray(value: [Any]?, forKey key: defaultKeys) {
        let aKey = key.rawValue
        UserDefaults.standard.set(value, forKey: aKey)
    }

    static func string(forKey key: defaultKeys) -> String? {
        let aKey = key.rawValue
        return UserDefaults.standard.string(forKey: aKey)
    }
    static func bool(forKey key: defaultKeys) -> Bool! {
        let aKey = key.rawValue
        return UserDefaults.standard.bool(forKey: aKey)
    }
    static func array(forKey key: defaultKeys) -> [Any]? {
        let aKey = key.rawValue
        return UserDefaults.standard.array(forKey: aKey)
    }
}

extension UserDefaults {
    
    // 账户信息
    struct BasicSettings: UserDefaultsSettable {
        enum defaultKeys: String {
            case iCloudSync
            case cardList
        }
    }

}

其他推荐阅读: iOS架构师之路:本地持久化方案 一步一步带你封装一个Swift本地缓存库 Syncing with CloudKit in a clean architecture (swift)