-
NSCoding, Codable 사용 방법 정리(코드)프로그래밍/iOS 2021. 9. 20. 19:50
이렇게 사용하는게 맞는진 모르겠지만, 일단 해결했던 방법을 정리해본다
1. func encode(with:)에서 key값과 함께 encode할때 방법들
클래스 안에 구조체 프로퍼티가 있어서 NSCoding + Codable을 섞는 상황임.
이때 최종 목적은 우선 객체를 Data 로 만들고, 그 Data를 func encode(_ object: Any?, forKey key: String) 함수를 사용하여 키 값과 함께 encode 하는 것이다.
방법1: JSONEncoder, JSONDecoder를 사용
func encode(with aCoder: NSCoder) { print(#function, #line) aCoder.encode(name, forKey: "name") aCoder.encode(age, forKey: "age") let jsonEncoder = JSONEncoder() let cityData = try! jsonEncoder.encode(city) // -> JSONEncoder를 사용하여 Data로 변환함 aCoder.encode(cityData, forKey: "city") aCoder.encode(imageData, forKey: "imageData") }
required init?(coder aDecoder: NSCoder) { name = aDecoder.decodeObject(forKey: "name") as! String age = aDecoder.decodeInteger(forKey: "age") do { let jsonDecoder = JSONDecoder() let cityData = aDecoder.decodeObject(forKey: "city") as! Data // -> Data로 바꾸고 self.city = try jsonDecoder.decode(City.self, from: cityData) // JSONDecoder를 사용하여 Data->City로 변환 } catch { self.city = City(name: "error", num: 10) } imageData = aDecoder.decodeObject(forKey: "imageData") as! Data }
방법2: PropertyListEncoder, PropertyListDecoder를 사용
func encode(with aCoder: NSCoder) { aCoder.encode(name, forKey: "name") // String aCoder.encode(age, forKey: "age") // Int do { let cityData = try PropertyListEncoder.init().encode(city) // -> 이 부분! aCoder.encode(cityData, forKey: "city") // City 구조체 } catch { print(#function, #line) } aCoder.encode(imageData, forKey: "imageData") // Data }
required init?(coder aDecoder: NSCoder) { print(#function, #line) name = aDecoder.decodeObject(forKey: "name") as! String age = aDecoder.decodeInteger(forKey: "age") let cityData = aDecoder.decodeObject(forKey: "city") as! Data city = try! PropertyListDecoder.init().decode(City.self, from: cityData) // -> 이 부분! imageData = aDecoder.decodeObject(forKey: "imageData") as! Data }
반응형'프로그래밍 > iOS' 카테고리의 다른 글
[iOS] UI 계층 구조 정리 (0) 2021.09.23 [iPadOS] iPadOS에서 multiple scene을 구성하기 (0) 2021.09.22 NSCoding 쓸 때 does not implement methodSignatureForSelector: 에러가 나는 경우 (0) 2021.09.17 [iOS] navigation bar의 large title를 쓸 때 반투명으로 바꾸는 방법 (0) 2021.08.25 [iOS] scrollViewDidEndScrollingAnimation이 시뮬레이터에서는 호출되지만 디바이스에서 호출되지 않을 때 (0) 2021.03.24