[Swift] 상속받은 Class를 Encoding, Decoding하는 법

chaaansooo·2022년 10월 2일
0

iOS

목록 보기
8/8
post-thumbnail
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된다.

profile
악으로 깡으로 버티기

0개의 댓글