Невозможно преобразовать значение типа 'String' в ожидаемый тип аргумента 'Data' - PullRequest
0 голосов
/ 26 февраля 2020

Я бы очень признателен за помощь. Я использую Swift 5.1. Я пытаюсь получить текущую дату (date4) и отформатировать ее как трехбуквенное сокращение месяца. Нет проблем, эта часть работает нормально. Затем я определяю константу с именем (currentMonthDate), которая содержит конкатенацию трехбуквенного месяца и строку «MoonData». Результат выглядит так: «FebMoonData» - до этого момента все работает как задумано.

Мой Json разделен по месяцам. Ниже показан сокращенный пример стоимости Json за два месяца. Очевидно, что моя модель предназначена для размещения Json структуры - не входит. Теперь вопрос. Если вы посмотрите на строку кода JSONDecoder, то заметите, что я пытаюсь использовать строку конкатенации «currentMonthDate» в строке кода декодера. Я думал, что с каждым новым месяцем data4 будет меняться, и currentMonthDate будет отражать это изменение, а затем найдет блок данных JSON, который отражает этот конкретный месяц. Я получаю сообщение об ошибке: Невозможно преобразовать значение типа 'String' в ожидаемый тип аргумента 'Data' Для ясности, если я просто введу FebMoonData (имя блока Json для февраля) в строке декодера все работает как положено. То есть он находит массив Json с именем FebMoonData. Спасибо!

// JSON

let FebMoonData = """
[

{"time":"20 Feb 2020 00:00 UT"}

]
""".data(using: .utf8)!

let MarMoonData = 
[

{"time":"20 Feb 2020 00:00 UT"}

]

""".data(using: .utf8)!

// End JSON


 let date4 = Date()
        let dateFormatterGet = DateFormatter()
        dateFormatterGet.dateFormat = "MMM"
        let currentMonthDate = dateFormatterGet.string(from: date4) + "MoonData"


        let moonphase = try! JSONDecoder().decode([MoonPhase].self, from: currentMonthDate)

1 Ответ

0 голосов
/ 26 февраля 2020

Параметр from для decode должен быть Data, а не String, это сообщение об ошибке. Буквальная строка даты как JSON data в любом случае не имеет смысла. Невозможно составить имена переменных во время выполнения.

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

let month = Calendar.current.component(.month, from: Date())

let data : Data
switch month {
   case 1: data = Data(JanMoonData.utf8)
   case 2: data = Data(FebMoonData.utf8)
   // ...
}

let moonphase = try! JSONDecoder().decode([MoonPhase].self, from: data)

или

let month = Calendar.current.component(.month, from: Date())

let moonJSON : String
switch month {
   case 1: moonJSON = JanMoonData
   case 2: moonJSON = FebMoonData
   // ...
}

let moonphase = try! JSONDecoder().decode([MoonPhase].self, from: Data(moonJSON.utf8)

или

let moonJSONArray = [JanMoonData, FebMoonData, MarMoonData, ..., DecMoonData]
let month = Calendar.current.component(.month, from: Date())
let moonJSON = moonJSONArray[month - 1]
let moonphase = try! JSONDecoder().decode([MoonPhase].self, from: Data(moonJSON.utf8)
...