UserDefaults 사용시 매번 긴 코딩하는게 귀찮아서 좋은 예제를 소개합니다.

import Foundation

@propertyWrapper
struct UserDefaultsWrapper<T: Codable> {
    private let key: String
    private let defaultValue: T

    init(key: String, defaultValue: T) {
        self.key = key
        self.defaultValue = defaultValue
    }

    var wrappedValue: T {
        get {
            // Read value from UserDefaults
            guard let data = UserDefaults.standard.object(forKey: key) as? Data else {
                // Return defaultValue when no data in UserDefaults
                return defaultValue
            }

            // Convert data to the desire data type
            //let value = try? JSONDecoder().decode(T.self, from: data)
            let value = try? PropertyListDecoder().decode([T].self, from: data)
            return value.first ?? defaultValue
        }
        set {
            // Convert newValue to data
            // IOS 11 에서 nil 출력됨
            // IOS 전체 버전에서 적용될려면 배열로 감싸서 사용해야됨.
            //let data = try? JSONEncoder().encode(newValue)       
            let data = try? PropertyListEncoder().encode([newValue])
            
            // Set value to UserDefaults
            UserDefaults.standard.set(data, forKey: key)
            UserDefaults.standard.synchronize()
        }
    }
}

struct UserData {
    // 자동로그인 여부
    @UserDefaultsWrapper(key: "isAutologin", defaultValue: false)
    static var isAutologin: Bool
    
    // 로그인 토큰
    @UserDefaultsWrapper(key: "loginToken", defaultValue: "")
    static var loginToken: String
    
    // APNS Device Token
    @UserDefaultsWrapper(key: "deviceToken", defaultValue: "")
    static var deviceToken: String
}
 

 

사용방법

UserData.isAutologin = true

+ Recent posts