Не соответствует протоколу Decodable - PullRequest
0 голосов
/ 20 октября 2019

У меня есть следующий код, который представляет хоккейную клюшку и некоторую информацию о ней. У меня есть проблема, когда флешка не соответствует Decodable. Я понимаю, что каждый тип, используемый в структуре, также должен быть кодируемым, и это так. Однако по какой-то причине строка «var rules» вызывает ошибку, которую я не знаю, как исправить. Спасибо!

enum StickLocation: Int, Codable, Hashable, CaseIterable {
    case handle, mid, bottom
}

enum StickCondition: Int, Codable, Hashable, CaseIterable {
    case pristine, scuffed, damaged, broken
}

struct HockeyStick: Identifiable, Codable {
    var barcode: Int
    var brand: String
    var conditions: [StickLocation:(condition:StickCondition, note:String?)]    // Offending line
    var checkouts: [CheckoutInfo]
    var dateAdded: Date
    var dateRemoved: Date?

    // Conform to Identifiable.
    var id: Int {
        return self.barcode
    }

    // If the stick was never removed then its in service.
    var inService: Bool {
        return self.dateRemoved == nil
    }
}

1 Ответ

1 голос
/ 21 октября 2019

Тип значения вашего словаря conditions - (StickCondition, String?), который является кортежем. Кортежи не являются Decodable / Encodable, и вы не можете заставить их соответствовать протоколам, поэтому, чтобы исправить это, я рекомендую вам создать новую структуру для замены кортежа следующим образом:

enum StickLocation: Int, Codable, Hashable, CaseIterable {
    case handle, mid, bottom
}

enum StickCondition: Int, Codable, Hashable, CaseIterable {
    case pristine, scuffed, damaged, broken
}

struct StickConditionWithNote: Codable, Hashable {
    var condition: StickCondition
    var note: String?
}

struct HockeyStick: Identifiable, Codable {
    var barcode: Int
    var brand: String
    var conditions: [StickLocation: StickConditionWithNote]
    var checkouts: [CheckoutInfo]
    var dateAdded: Date
    var dateRemoved: Date?

    // Conform to Identifiable.
    var id: Int {
        return self.barcode
    }

    // If the stick was never removed then its in service.
    var inService: Bool {
        return self.dateRemoved == nil
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...