Swift: словарь ключ содержит значение, но это ошибка, ноль - PullRequest
0 голосов
/ 12 декабря 2018

, когда я пытаюсь напечатать значение ключа словаря fromdate, оно показывает ошибку, даже если оно содержит значение с этим конкретным ключом.

Тема 1: Неустранимая ошибка: неожиданно обнаружен ноль при развертывании необязательного значения

Это код для сохранения значения в словаре.

 func saveRecentSearch()  {
        var dictSearch = [String:Any]()

        if let onJourney = Global.onWordJ {
            dictSearch["From"] = onJourney.source?.CM_CityName
            dictSearch["Fromid"] = onJourney.source?.CM_CityID
            dictSearch["To"] = onJourney.destination?.CM_CityName
            dictSearch["Toid"] = onJourney.destination?.CM_CityID
            let date = onJourney.journeyDate
            let formatter = DateFormatter()
            formatter.dateFormat = "yyyy-MM-dd"
            let myString = formatter.string(from: date!)
            let yourDate: Date? = formatter.date(from: myString)
            formatter.dateFormat = "dd-MMM-yyyy"
            let updatedString = formatter.string(from: yourDate!)
            print(updatedString)
            dictSearch["fromdate"] = updatedString
        }

Ключ fromdate уже сохранит эту дату.Проверьте изображение

enter image description here

Но когда я пытаюсь получить эти данные, они обнаруживают ноль в ключе "fromdate".Вот код.

var arrSearch = [[String:Any]]()

override func viewDidLoad() {
        super.viewDidLoad()
        if let arr = UserDefault["Search"] {
            arrSearch.append(contentsOf: (arr as! [[String:Any]]))
        } 
             self.tblSearch.reloadData()
    }

Метод tableView

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "RecentCell") as! RecentCell
        cell.selectionStyle = .none
        let dict = arrSearch[indexPath.row]
        cell.lblFrom.text = (dict["From"] as! String)
        cell.lblTo.text = (dict["To"] as! String)
        let strDate = (dict["fromdate"])
        cell.lblDate.text = (strDate as! String) //This line showing Error
        return cell
    }

Что не так с кодом?Я получил все значение, кроме значения ключа fromdate.

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Вы должны получить значение из словаря путем приведения.

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "RecentCell") as! RecentCell
        cell.selectionStyle = .none
        let dict = arrSearch[indexPath.row]
        cell.lblFrom.text = (dict["From"] as! String)
        cell.lblTo.text = (dict["To"] as! String)
        if let strDate = (dict["fromdate"] as? String)
        {
           cell.lblDate.text = strDate
         }

        return cell
    }
0 голосов
/ 12 декабря 2018

Это потому, что dictSearch ожидает Any как переменную, но вы передаете String, следовательно, происходит сбой:

Возможно, если все переменные являются строками, измените его на:

var dictSearch = [String:String]()

Если нет, вам нужно привести дату как любую не строку

Это не рекомендуется, но попробуйте следующее:

guard let strDate = dict["fromdate"] as? String else { 
    print("error")
    return
} 
yourlabel.text = strDate
...