【问题标题】:iOS - Adding objects to NSMutableDictionary causing crashiOS - 将对象添加到 NSMutableDictionary 导致崩溃
【发布时间】:2015-02-10 05:19:43
【问题描述】:

在我正在开发的应用程序中,我正在读取 JSON 文件。此文件包含玩家列表。每个玩家都有一系列属性。

我创建了一个可变数组和一个可变字典来存储数据。我正在尝试将字典存储到数组索引中。我正在尝试使用以下代码:

var data = JSON(json!)
let players = data["API"]["Data"]
var i = 0
for (index:String, player:JSON) in players {
    if let name = player["name"].string { 
        //THIS IS WHERE THE ERROR HAPPENS
        self.pdata.setObject(name, forKey: "name")
    }
    if let serial = player["serial_number"].string {
        self.pdata.setObject(serial, forKey: "name")
    }
    if let status = player["player_status"].string {
        self.pdata.setObject(status, forKey: "status")
    }
    if let resolution = player["resolution"].string {
        self.pdata.setObject(resolution, forKey: "resolution")
    }
    if let lastConnected = player["last_connected"].string {
        self.pdata.setObject(lastConnected, forKey: "last_connected")
    }
    if let diskFree = player["disk_free_percent"].string {
        self.pdata.setObject(diskFree, forKey: "disk_free")
    }
    if let memTotal = player["mem_total_phys"].string {
        self.pdata.setObject(memTotal, forKey: "mem_total")
    }
    if let memAvail = player["mem_avail_phys"].string {
        self.pdata.setObject(memAvail, forKey: "mem_avail")
    }

    if(self.pdata.count > 0) {
        self.playerList.insertObject(self.pdata, atIndex: i)
        self.pdata.removeAllObjects()
        i++
    }
}

使用此代码我收到以下错误,即使我在分配它之前检查了值:

致命错误:在展开可选值时意外发现 nil

【问题讨论】:

  • 哪一行导致错误?
  • 我注释了错误所在的代码。第 7 行(包括注释)。谢谢。
  • player["name"] 你有这个字段的数据吗?你可以使用 player["name"].stringValue 在这种情况下如果 player["name"] nil 属性返回空字符串
  • API 返回的任何播放器都会有一个名称,因为这是系统中的必填字段。不过,我会给 .stringValue 一个机会。
  • player["name"] 具有“字符串”属性的类型是什么?

标签: ios swift nsmutablearray nsmutabledictionary


【解决方案1】:

如果您使用的是 SwiftyJSON(看起来就是这样),那么它可以很好地防止 nil 值。很有可能

如果您将 pdata 声明为:

var pdata:NSMutableDictionary!

那么这就是问题所在。您不是在创建字典,而是在创建一个可选的。在某些时候,您必须实际创建字典。您可以通过以下方式在同一个地方执行此操作:

var pdata = NSMutableDictionary()

改为。

【讨论】:

  • 哇。好像我错过了一样。感谢您的回答。
【解决方案2】:

评论此代码检查“名称”值我认为问题可能出在这部分代码if(self.pdata.count > 0) { self.playerList.insertObject(self.pdata, atIndex: i) self.pdata.removeAllObjects() i++ }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    相关资源
    最近更新 更多