Не может соответствовать декодируемому или кодируемому (с использованием кодируемого), даже если используемый объект соответствует самому себе

У меня возникли проблемы с согласованием двух протоколов вместе с использованием протокола Codable.

Насколько я понимаю, даже если я использовал пользовательский объект, если этот объект успешно соответствует Codable, то любая ссылка на объект, которая также может соответствовать.

У меня есть следующий код, и я не понимаю, почему я получаю ошибки:

import UIKit
import Foundation

protocol PromotionProtocol: Codable {
    var promotionType: Int? { get }
    var promotionCode: String? { get }
    var fileName: String? { get }
    var facetDescription: String? { get }
    var promoDescription: String? { get }
}

class Promotion: PromotionProtocol {
    var promotionType: Int?
    var promotionCode: String?
    var fileName: String?
    var facetDescription: String?
    var promoDescription: String?
}

protocol PromotionInfoProtocol: Codable {
    var cornerPromotion: PromotionProtocol? { get }
    var mainPromotion: PromotionProtocol? { get }
    var isTopFive: Bool? { get }
}

class PromoInfo: PromotionInfoProtocol {
    var cornerPromotion: PromotionProtocol?
    var mainPromotion: PromotionProtocol?
    var isTopFive: Bool?
}

Все внутри «PromotionProtocol» является либо строкой, либо целым числом, так что все в порядке. Но я получаю ошибки, что продвижение класса не соответствует Encodable и Decodable.


person SamRowley    schedule 10.10.2017    source источник
comment
Promotion соответствует CodablePromoInfo, но не соответствует. PromotionProtocol не является типом, соответствующим Codable, так как протоколы не всегда соответствуют сами себе (только подумайте: какой конкретный тип должен быть создан при декодировании cornerPromotion и mainPromotion?). Сравните stackoverflow.com/q/44441223/2976878   -  person Hamish    schedule 10.10.2017
comment
Не связано, но должны ли все ваши свойства действительно быть необязательными?   -  person Hamish    schedule 10.10.2017
comment
Возможный дубликат Протокол, расширяющий Encodable (или Codable), не соответствовать этому   -  person Shinforinpola    schedule 17.10.2018