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를 직렬화하고 역직렬화할 수 있습니다.