[IOS] UserDefaults 에 struct 저장 방법

UserDefaults는 NSString, NSNumber, NSData, NSDate, NSArray, NSDictionary 등과 같은 몇 가지 기본 데이터 타입들만 지원하며, 직접 custom struct를 저장할 수는 없습니다. 그러나 struct를 UserDefaults에 저장하려면 해당 struct를 직렬화(serialize)하여 위에서 언급한 데이터 타입 중 하나로 변환하고 저장해야 합니다.

일반적으로, struct를 UserDefaults에 저장하기 위해 struct를 JSON 문자열로 변환한 후 UserDefaults에 문자열로 저장하는 방법이 많이 사용됩니다. JSONSerialization을 사용하여 struct를 JSON 문자열로 변환할 수 있습니다.

다음은 struct를 UserDefaults에 저장하는 예제입니다:

// 저장할 custom struct 정의
struct Person: Codable {
    var name: String
    var age: Int
}

// struct 인스턴스 생성
let person = Person(name: "John Doe", age: 30)

// struct를 JSON 문자열로 직렬화
do {
    let encoder = JSONEncoder()
    let data = try encoder.encode(person)
    if let jsonString = String(data: data, encoding: .utf8) {
        // UserDefaults에 JSON 문자열 저장
        UserDefaults.standard.set(jsonString, forKey: "personKey")
    }
} catch {
    print("Error encoding struct to JSON: \(error)")
}

위의 예제에서는 Person이라는 custom struct를 정의하고, 인스턴스를 생성합니다. 그런 다음, JSONEncoder를 사용하여 struct를 JSON 데이터로 직렬화한 후, 이를 문자열로 변환하여 UserDefaults에 저장합니다.

이제 저장된 JSON 문자열을 다시 struct로 변환하여 불러올 수 있습니다:

// UserDefaults에서 JSON 문자열 불러오기
if let jsonString = UserDefaults.standard.string(forKey: "personKey") {
    if let jsonData = jsonString.data(using: .utf8) {
        do {
            let decoder = JSONDecoder()
            let person = try decoder.decode(Person.self, from: jsonData)
            print("Name: \(person.name), Age: \(person.age)")
        } catch {
            print("Error decoding JSON to struct: \(error)")
        }
    }
}

위의 예제에서는 UserDefaults에서 저장된 JSON 문자열을 불러와 JSONDecoder를 사용하여 다시 Person struct로 디코딩합니다. 이렇게 하면 UserDefaults에 struct를 저장하고 불러올 수 있습니다. Codable 프로토콜을 이용하여 쉽게 struct를 직렬화하고 역직렬화할 수 있습니다.