класс, производный от класса, совместимого с протоколом Decodable, выдает ошибку компилятора «Класс CardListResponse» не имеет инициализаторов»

public struct CodeAndDetails: Codable {
    public let html: String
    public var code: String

    private enum CodingKeys: String, CodingKey {
        case html = "DETAILS", code = "CODE"
    }

    public func getMessage(font: UIFont) -> NSAttributedString? {
        let res = NSAttributedString(html: html, font: font)
        return res
    }
}

public class BaseResponse: Decodable {

    enum CodingKeys: String, CodingKey {
        case successDetails = "Success"
    }
    public let successDetails: [CodeAndDetails]
}

здесь:

public class CardListResponse: BaseResponse {
    public let cards: [DebitCard]?
    public let activeCardId: Int?

    enum CodingKeys: String, CodingKey {
        case cards = "row"
        case activeCardId = "CurrentActiveId"
    }
}

Я получил:

Класс CardListResponse не имеет инициализаторов

Какие у меня есть варианты, чтобы справиться с этой стремительной чушью?

Проблема переместилась в рантайм. Родственный вопрос здесь: Swift Decodable терпит неудачу для класса, производного от декодируемого совместимого класса


person Anton Tropashko    schedule 22.07.2019    source источник


Ответы (1)


Вы должны установить свойства CardListResponse на var, а не на let

  • let постоянно, что означает, что вы не можете изменить значение

Что вы можете сделать?

  • Вы можете установить значение по умолчанию для свойств cards и activeCardId, например:

    public class CardListResponse: BaseResponse {
        public let cards: [DebitCard]? = nil
        public let activeCardId: Int? = nil
    
        enum CodingKeys: String, CodingKey {
            case cards = "row"
            case activeCardId = "CurrentActiveId"
        }
    }
    

OR

  • Вы можете изменить let на var, например:

    public class CardListResponse: BaseResponse {
        public var cards: [DebitCard]?
        public var activeCardId: Int?
    
        enum CodingKeys: String, CodingKey {
            case cards = "row"
            case activeCardId = "CurrentActiveId"
        }
    }
    

Я надеюсь, что это работает.

Наслаждаться.

person emrcftci    schedule 22.07.2019
comment
Я забыл упомянуть, что нулевой подход к их сохранению не сработал. - person Anton Tropashko; 22.07.2019
comment
Привет @AntonTropashko, ошибка та же самая Class 'CardListResponse' has no initializers ? - person emrcftci; 22.07.2019
comment
SuccessDetails в базовом классе анализируется просто отлично, это vars в производном классе, которые остаются нулевыми - person Anton Tropashko; 22.07.2019
comment
нет, изменение на var исправило это. Но Decodable - это борк. Я полагаю, что технически вы решили проблему времени компиляции, и проблема времени выполнения выходит за рамки вопроса. - person Anton Tropashko; 22.07.2019
comment
Пожалуйста, поделитесь дополнительным кодом, например, ваш ответ JSON и DebitCard модель. Я проверю ваш "сестринский" вопрос :) Наслаждайтесь - person emrcftci; 22.07.2019
comment
См. сестринский вопрос для класса, производного от декодируемого совместимого класса"> stackoverflow.com/questions/57146148/ - person Anton Tropashko; 22.07.2019