ObservableObject 와 Codable을 같이 채택하면 오류가 발생 한다.
Type 'TodoItem' does not conform to protocol 'Decodable'
Type 'TodoItem' does not conform to protocol 'Encodable'
@Published 프로퍼티 래퍼를 사용하면 Published 로 래핑되는데, 해당 래퍼는 Codable을 채택하고 있지 않다.
따라서 Codable을 채택하도록 extension을 적용한다.
//PublishedWrapper라는 클래스를 선언 후, Published형 타입을 받아 @Published에 저장한다.
private class PublishedWrapper<T> {
@Published private(set) var value: T
init(_ value: Published<T>) {
_value = value
}
}
//PublishedWrapper를 통해 Endcodable, Decodable 에서 값 접근을 하기 위해 Published를 extension 해준다.
extension Published {
var unofficialValue: Value {
PublishedWrapper(self).value
}
}
//decode 시 Published<Value>.init을 실행해주며 디코딩 값을 Published로 감싸도록 한다
extension Published: Decodable where Value: Decodable {
public init(from decoder: Decoder) throws {
self.init(wrappedValue: try .init(from: decoder))
}
}
//encode 채택 후 구현 시 Published<Value> 형 값이 아닌, unofficialValue 값(실제 값)으로 인코딩 해준다.
extension Published: Encodable where Value: Encodable {
public func encode(to encoder: Encoder) throws {
try unofficialValue.encode(to: encoder)
}
}
'IOS' 카테고리의 다른 글
SwiftUI ViewBuilder란 (0) | 2023.02.17 |
---|---|
Swift GCD (0) | 2023.02.02 |
Swift enum (0) | 2022.12.31 |
Swift 에러 핸들링 (try, catch, throw, throws, do) (0) | 2022.12.28 |
UIKit 커스텀 애니메이션 (0) | 2022.12.20 |