【问题标题】:ERROR: Thread 1: Signal SIGABRT (While append the element in the Array)错误:线程 1:信号 SIGABRT(在数组中附加元素时)
【发布时间】:2019-05-12 11:03:16
【问题描述】:

当我尝试在数组中附加元素时,会显示错误。这是代码。

func saveRecentSearch()  {
        var dictSearch = [String:Any]()
        if let onJourney = Global.onWordJ {
            dictSearch["From"] = onJourney.source
            dictSearch["Fromid"] = Global.onWordJ?.source?.CM_CityID
            dictSearch["To"] = Global.onWordJ?.destination
            dictSearch["Toid"] = Global.onWordJ?.destination?.CM_CityID
        }
        if let onJourney = Global.returnJ {
            dictSearch["todate"] = onJourney.journeyDate!
        }
        var arr = [[String:Any]]()
        if let arrSearch = UserDefault["Search"] {
            DispatchQueue.main.async {
                arr.append(arrSearch as! [String : Any])
                arr.append(dictSearch)
            }
        } else {
            arr.append(dictSearch)
        }
        UserDefault["Search"] = arr
    }

我在我的 cellForRowAt indexPath tableView 方法中调用了这个函数。

【问题讨论】:

  • 什么是UserDefault
  • UserDefaults.Standard
  • 显示您在UserDefaults 中存储“搜索”键字典的代码。
  • 为什么在cellForRow中调用这个函数? cellForRow 被非常频繁地调用并且该函数与任何indexPath 无关。因此,相同的代码被执行了很多次。那是相当低效的。
  • 好的。我改变那对不起。但是错误的原因是什么?

标签: arrays swift xcode xcode6


【解决方案1】:

您应该已经在问题中显示了错误消息。错误很明显。

Search 的值是一个数组,因此强制将as! [String : Any] 强制转换为字典 失败。

把代码改成

...
var arr = [[String:Any]]()
if let arrSearch = UserDefault["Search"] as? [[String : Any]] {
   arr.append(contentsOf: arrSearch)
}
arr.append(dictSearch)
UserDefault["Search"] = arr
...

分派到主线程并且不需要else 子句。

【讨论】:

  • 哦。谢谢你节省了我的时间。我多次加班都面临同样的问题,我只是通过反复试验的方法来解决它。你能解释一下你到目前为止做了什么吗?再次感谢。
  • 阅读错误信息。集合类型Array(基于索引)和Dictionary(基于键)是不同的,彼此不相关
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多