Тип ‘SparklineIn7D’ и ‘Coin’ не соответствуют протоколу ‘Decodable’

Вопрос или проблема

struct Coin: Codable, Identifiable {
let id, symbol, name: String
let image: String
let currentPrice: Double
let marketCapRank: Int
let marketCap, fullyDilutedValuation: Double?
let totalVolume, high24H, low24H: Double?
let priceChange24H, priceChangePercentage24H: Double
let marketCapChange24H, marketCapChangePercentage24H: Double?
let circulatingSupply, totalSupply, maxSupply, ath: Double?
let athChangePercentage: Double?
let athDate: String?
let atl, atlChangePercentage: Double?
let atlDate: String?
let lastUpdated: String?
let sparklineIn7D: SparklineIn7D?
let priceChangePercentage24HInCurrency: Double?

enum CodingKeys: String, CodingKey {
case id, symbol, name, image
case currentPrice = “current_price”
case marketCap = “market_cap”
case marketCapRank = “market_cap_rank”
case fullyDilutedValuation = “fully_diluted_valuation”
case totalVolume = “total_volume”
case high24H = “high_24h”
case low24H = “low_24h”
case priceChange24H = “price_change_24h”
case priceChangePercentage24H = “price_change_percentage_24h”
case marketCapChange24H = “market_cap_change_24h”
case marketCapChangePercentage24H = “market_cap_change_percentage_24h”
case circulatingSupply = “circulating_supply”
case totalSupply = “total_supply”
case maxSupply = “max_supply”
case ath
case athChangePercentage = “ath_change_percentage”
case athDate = “ath_date”
case atl
case atlChangePercentage = “atl_change_percentage”
case atlDate = “atl_date”
case lastUpdated = “last_updated”
case sparklineIn7D = “sparkline_in_7d”
case priceChangePercentage24HInCurrency = “price_change_percentage_24h_in_currency”
}
}

enum Currency: String, Codable {
case btc = “btc”
case eth = “eth”
case usd = “usd”
}

struct SparklineIn7D: Codable {
let price: [Double]
}

Я имею структуру, которая содержит свойство. Тип этого свойства может варьироваться, но будет соответствовать указанному протоколу. Проблема в том, что сама структура не может соответствовать Decodable. ‘SparklineIn7D’ и ‘Coin’ не соответствуют протоколу ‘Decodable’.

Ответ или решение

Сообщение об ошибке «’SparklineIn7D’ и ‘Coin’ не соответствуют протоколу ‘Decodable’» указывает на проблемы с соответствием спецификации Swift для кодирования и декодирования. Рассмотрим, как можно устранить эту проблему и обеспечить правильное декодирование структур.

Анализ структуры Coin

Структура Coin в вашем коде уже реализует протокол Codable, который является комбинацией Encodable и Decodable. Этот подход позволяет вам сериализовать и десериализовать объекты с использованием стандартного механизма Swift.

Проблема 1: SparklineIn7D

Одна из потенциальных причин, по которой возникает это сообщение об ошибке, заключается в том, что структура SparklineIn7D может не соответствовать требованиям протокола Codable. Убедитесь, что в вашей структуре SparklineIn7D все поля также корректно определены и соответствуют требованиям для декодирования.

struct SparklineIn7D: Codable {
    let price: [Double]
}

Как видно из вышеуказанного кода, структура SparklineIn7D имеет только одно свойство, представляющее массив Double. Она сама по себе должна корректно соответствовать протоколу Codable. Если это не так, проверьте, какие данные вы получаете в JSON. Возможно, структура JSON, которая перемещается в модель, не соответствует определению.

Проблема 2: Структура JSON

Другим аспектом, который стоит рассмотреть, является формат данных, который вы ожидаете получать из сети или от других источников. Если JSON не соответствует структуре Coin (или SparklineIn7D), это также может привести к ошибкам декодирования.

Пример JSON, который должен соответствовать вашей структуре, может выглядеть следующим образом:

{
    "id": "1",
    "symbol": "btc",
    "name": "Bitcoin",
    "image": "https://example.com/bitcoin.png",
    "current_price": 58000,
    "market_cap": 1000000000,
    "market_cap_rank": 1,
    "fully_diluted_valuation": 1200000000,
    "total_volume": 35000000,
    "high_24h": 59000,
    "low_24h": 57000,
    "price_change_24h": -1000,
    "price_change_percentage_24h": -1.69,
    "market_cap_change_24h": -5000000,
    "market_cap_change_percentage_24h": -0.5,
    "circulating_supply": 18000000,
    "total_supply": 21000000,
    "max_supply": 21000000,
    "ath": 64800,
    "ath_change_percentage": -10,
    "ath_date": "2021-04-14T00:00:00Z",
    "atl": 67,
    "atl_change_percentage": 85015,
    "atl_date": "2013-07-06T00:00:00Z",
    "last_updated": "2023-10-21T00:00:00Z",
    "sparkline_in_7d": {
        "price": [58000, 58200, 58100, ...]
    },
    "price_change_percentage_24h_in_currency": -1.69
}

Убедитесь, что все поля, которые вы определили в структуре Coin, присутствуют в JSON, и их названия точно соответствуют описанным в CodingKeys.

Заключение

Чтобы устранить проблему «’SparklineIn7D’ и ‘Coin’ не соответствуют протоколу ‘Decodable’», убедитесь, что обе структуры правильно структурированы и соответствуют требованиям протокола. Проверьте структуру JSON, которую вы пытаетесь декодировать, на соответствие всем ожидаемым полям. На этом этапе важно удостовериться в точности и согласованности используемых вами данных.

Если вы будете следовать этим рекомендациям, это значительно увеличит ваши шансы на успешное декодирование данных и устранение текущей ошибки.

Оцените материал
Добавить комментарий

Капча загружается...