Не удается преобразовать значение типа [Строка] в ожидаемый тип аргумента [Дата] с помощью DateFormatter

#ios #json #swift #dateformatter

Вопрос:

Я пытаюсь получить массив [Дата] из [Строки], но я получаю ошибку: Не удается преобразовать значение типа «[Строка] «в ожидаемый тип аргумента «Строка»

Я хочу получить три разные даты, чтобы поместить их в разные ячейки. В свойстве «список» в моем JSON есть три разные даты

Мой Код:

 //Array of Strings let time = self.twentyFourHoursViewModel.twentyFourHoursWeather?.twentyFourHoursTime   let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" dateFormatter.locale = Locale(identifier: "ru_RU")   let dateDate = time.map({ dateFormatter.date(from: $0) }) lt;--Error here  

Моя модель просмотра:

 class TwentyFourHoursViewModel {  // MARK: -Properties let twentyFourHoursWeatherService: ITwentyFourHoursWeatherService  var twentyFourHoursWeather: TwentyFourHoursMainScreenWeatherModel?  init(twentyFourHoursWeatherService: ITwentyFourHoursWeatherService) {  self.twentyFourHoursWeatherService = twentyFourHoursWeatherService }  func twentyFourHoursViewDidLoad() {    twentyFourHoursWeatherService.getCitiesWeather { [weak self] result in  guard let self = self else { return }    switch result {  case .success(let result):  self.twentyFourHoursWeather = .init(  twentyFourHoursTime: [result.list[0].dtTxt, result.list[1].dtTxt, result.list[2].dtTxt],  twentyFourHoursIcon: result.list[0].weather[0].icon,  twentyFourHoursTemp: result.list[0].main.temp  )  self.twentyFourHoursWeatherDidChange?()  case .failure(let error):  print(error.localizedDescription)  }  } }  var twentyFourHoursWeatherDidChange: (() -gt; Void)?  

}

Мои Данные:

 struct TwentyFourHoursMainScreenWeatherModel {  let twentyFourHoursTime: [String]? let twentyFourHoursIcon: String? var twentyFourHoursTemp: Double?   

}

 struct TwentyFourHoursCitiesWeather: Decodable {  let cod: String  let message, cnt: Int  let list: [List]  let city: City }  struct List: Decodable {  let dt: Int  let main: TwentyFourHoursMain  let weather: [TwentyFourHoursWeather]  let clouds: TwentyFourHoursClouds  let wind: TwentyFourHoursWind  let visibility: Int  let pop: Double  let rain: Rain?  let sys: TwentyFourHoursSys  let dtTxt: String  

Мой JSON:

 { "cod": "200", "message": 0, "cnt": 3, "list": [  {  "dt": 1638986400,  "main": {  "temp": 279.95,  "feels_like": 276.49,  "temp_min": 278.97,  "temp_max": 279.95,  "pressure": 995,  "sea_level": 995,  "grnd_level": 994,  "humidity": 68,  "temp_kf": 0.98  },  "weather": [  {  "id": 803,  "main": "Clouds",  "description": "broken clouds",  "icon": "04n"  }  ],  "clouds": {  "all": 75  },  "wind": {  "speed": 5.58,  "deg": 245,  "gust": 12.34  },  "visibility": 10000,  "pop": 0.1,  "sys": {  "pod": "n"  },  "dt_txt": "2021-12-08 18:00:00"  },  {  "dt": 1638997200,  "main": {  "temp": 279.53,  "feels_like": 275.54,  "temp_min": 278.69,  "temp_max": 279.53,  "pressure": 996,  "sea_level": 996,  "grnd_level": 995,  "humidity": 66,  "temp_kf": 0.84  },  "weather": [  {  "id": 803,  "main": "Clouds",  "description": "broken clouds",  "icon": "04n"  }  ],  "clouds": {  "all": 72  },  "wind": {  "speed": 6.71,  "deg": 246,  "gust": 13.62  },  "visibility": 10000,  "pop": 0,  "sys": {  "pod": "n"  },  "dt_txt": "2021-12-08 21:00:00"  },  {  "dt": 1639008000,  "main": {  "temp": 278.98,  "feels_like": 274.86,  "temp_min": 278.5,  "temp_max": 278.98,  "pressure": 998,  "sea_level": 998,  "grnd_level": 996,  "humidity": 71,  "temp_kf": 0.48  },  "weather": [  {  "id": 803,  "main": "Clouds",  "description": "broken clouds",  "icon": "04n"  }  ],  "clouds": {  "all": 80  },  "wind": {  "speed": 6.62,  "deg": 256,  "gust": 12.17  },  "visibility": 10000,  "pop": 0,  "sys": {  "pod": "n"  },  "dt_txt": "2021-12-09 00:00:00"  } ], "city": {  "id": 2643743,  "name": "London",  "coord": {  "lat": 51.5085,  "lon": -0.1257  },  "country": "GB",  "population": 1000000,  "timezone": 0,  "sunrise": 1638949983,  "sunset": 1638978728 }  

}

Ответ №1:

Вы можете сначала попробовать проверить необязательно или сделать объект twentyFourHoursTime необязательным

 //Array of Strings  let time = self.twentyFourHoursViewModel.twentyFourHoursWeather?.twentyFourHoursTime  guard let time = time else {  //Handle error  return  }  let dateFormatter = DateFormatter()  dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"  dateFormatter.locale = Locale(identifier: "ru_RU")    let dateDate = time.map({ dateFormatter.date(from: $0) })  

Ответ №2:

Похоже twentyFourHoursTime , что это необязательно в TwentyFourHoursMainScreenWeatherModel структуре.

 struct TwentyFourHoursMainScreenWeatherModel  { let twentyFourHoursTime: [String]? let twentyFourHoursIcon: String? var twentyFourHoursTemp: Double?  }  

Попробуйте сделать следующее:

let dateDate = time?.map({ dateFormatter.date(from: $0) })

Называть это время необязательно.

На изображении ниже — последняя строка-это то, что у вас есть в коде, а предпоследняя строка-мой совет.

введите описание изображения здесь

Ответ №3:

проверьте результат, который возвращается в

getCitiesWeather

обратный вызов и убедитесь, что вы десериализуете свой json правильно, как вы ожидаете