class DefaultRectangle: Codable {
var id = UUID().uuidString
var point: Point
var size: Size
var alpha: Alpha
init(id: String = UUID().uuidString, point: Point, size: Size, alpha: Alpha) {
self.id = id
self.point = point
self.size = size
self.alpha = alpha
}
convenience init(point: Point) {
self.init(point: point, size: Size(width: 150, height: 120), alpha: Alpha(alpha: 1))
}
}
다음과 같은 Class에 Codable을 채택하고 DefaultRectangle
를 상속받는 Child Class를 만들어보자.
final class PhotoRectangle: DefaultRectangle {
var image: Data
init(point: Point, size: Size, alpha: Alpha, image: Data) {
self.image = image
super.init(point: point, size: size, alpha: alpha)
}
convenience init(point: Point, image: Data) {
self.init(point: point, size: Size(width: 150, height: 120), alpha: Alpha(alpha: 1), image: image)
}
}
image라는 프로퍼티를 추가적으로 만들고 encoding을 하면 image는 들어가지 않게 된다.
final class PhotoRectangle: DefaultRectangle {
var image: Data
enum CodingKeys: String, CodingKey { case image }
init(point: Point, size: Size, alpha: Alpha, image: Data) {
self.image = image
super.init(point: point, size: size, alpha: alpha)
}
convenience init(point: Point, image: Data) {
self.init(point: point, size: Size(width: 150, height: 120), alpha: Alpha(alpha: 1), image: image)
}
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
let image = try container.decode(Data.self, forKey: .image)
self.image = image
try super.init(from: decoder)
}
override func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(image, forKey: .image)
try super.encode(to: encoder)
}
}
위와 같이 encoding 메소드를 override해주고, required init을 설정해주면 Child Class에서 선언한 프로퍼티도 정상적으로 잘 encoding된다.