-
UserDefaults에서 커스텀 객체 사용하기iOS/Swift 2022. 1. 11. 23:03
안녕하세요!! 이번엔 UserDefaults에서 기본 자료형이 아닌 커스텀 객체를 활용하는 방법을 정리했습니다.
이번 글도 노션에서 옮겨와 말이 짧습니다!! 양해해주세용😽
먼저, UserDefaults가 뭐지? 하시는 분들은 저번 글을 읽고 와주세요 :)
UserDefaults
안녕하세요!! 이번엔 UserDefaults에 대해서 정리했습니다. 이번 글도 노션에서 옮겨와 말이 짧습니다!! 양해해주세용😽 UserDefaults란? Apple에서 제공해주는 Key:Value 형태의 기본 저장소 단일 데이터
makemakeway.tistory.com
UserDefaults에서 커스텀 객체를 저장하고, 가져오기 위해서는 어떤 방법을 사용해야 할까??
저장할 때에는 커스텀 객체를 UserDefaults에서 사용 가능한 객체 형태로 만들고 저장해두고,
불러올 때에는 UserDefaults에 저장된 객체를 다시 커스텀 객체로 바꾸어 주면 된다.
이 과정을 Encode, Decode라고 한다.
우선, 앱에서 사용할 객체를 하나 만들어준다.
struct DiaryData: Codable { var content: String // 일기의 내용 var feeling: String // 선택한 감정 } // encoding, decoding을 할 때에는 Codable(Encodable + Decodable) 프로토콜을 채택해야한다.
커스텀 객체가 Codable 프로토콜을 채택하면 인코더 및 디코더가 제공하는 포맷으로 변환할 수 있다.
DiaryData 자체에는 Property List 또는 JSON을 처리하는 코드가 없지만,
DiaryData를 PropertyListEncoder 및 JSONEncoder 클래스를 사용하여 인코딩 할 수 있게된다.
UserDefaults에 커스텀 객체 저장하기
@IBAction func editCompletion(_ sender: UIButton) { let defaults = UserDefaults.standard // 커스텀 객체 저장 let data = DiaryData(content: self.content.text, feeling: self.selectedFeeling.text ?? "!") // userDefault에 PropertyListEncoder를 이용하여 데이터 저장 // try?는 오류가 발생할 수 있지만, 시도해 보겠다는 의미 defaults.setValue(try? PropertyListEncoder().encode(data), forKey: "\\(self.selectedDate.text!)") dismiss(animated: true, completion: nil) }
저장은 간단하다. PropertyListEncoder를 사용하여 인코딩해주고,
UserDefaults에 저장만 해주면 된다.
UserDefaults에서 커스텀 객체 불러오기
func loadData() { if let data = UserDefaults.standard.value(forKey: "\\(self.selectedDate.text!)") as? Data { self.data = try? PropertyListDecoder().decode(DiaryData.self, from: data) print(self.data!) self.content.text = self.data?.content self.selectedFeeling.text = self.data?.feeling } }
저장된 커스텀 객체를 불러오는 작업은 약간 복잡하다.
첫번째 줄은 DiaryData값을 decode 하기 위해서,
PropertyListDecoder가 디코딩 가능한 Data 형태로 캐스팅 하는 작업이다.
타입 캐스팅이 성공하고, UserDefaults 값이 존재한다면, data를 DiaryData 형태로 디코딩한다.
디코딩이 성공한다면, data를 DiaryData로 이용가능하다.
'iOS > Swift' 카테고리의 다른 글
UISearchBar에서 사용자가 입력을 멈췄을 때 자동으로 검색하기(실시간 검색) (0) 2022.01.11 특정 모서리에만 CornerRadius 적용하기 (0) 2022.01.11 UITableViewCell 동적 높이 할당(UITableView Dynamic height) (0) 2022.01.11 코드로 TabBar Controller 연결하기 (0) 2022.01.11 코드로 Navigation Controller 연결하기 (0) 2022.01.11