Swift:Dictionary Key包含的值仍然是错误nil

时间:2018-12-12 07:09:49

标签: ios swift xcode dictionary null

当我尝试打印字典键fromdate的值时,即使它包含具有特定键的值,也会显示错误。

  

线程1:致命错误:展开包装时意外发现nil   可选值

这是用于在字典中保存值的代码。

 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”键中找不到nil。这是代码。

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 :(得分:3)

这是因为JsonConvert.SerializeObject(ObjectName, new JsonSerializerSettings(){ PreserveReferencesHandling = PreserveReferencesHandling.Objects, Formatting = Formatting.Indented });期望dictSearch作为变量,但是您传递的是Any,因此它崩溃了:

也许所有变量都是字符串,请将其更改为:

String

如果不是,则需要将日期强制转换为任何非字符串

不建议这样做,但是请尝试以下方法:

var dictSearch = [String:String]()

答案 1 :(得分:1)

您应该通过铸造从字典中获得价值。

    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
    }