【问题标题】:Swift: Looping through a Dictionary ArraySwift:遍历字典数组
【发布时间】:2015-02-18 18:55:09
【问题描述】:

我正在努力遍历从 Web 服务调用返回的字典值数组。

我已经实现了以下代码,但我似乎在运行时遇到了崩溃。

我还想将结果存储到自定义结构中。真的很难实现这一点,到目前为止,这里的答案还没有奏效。如果有人能够提供帮助,将不胜感激。

    let nudgesURLString = "http://www.whatthefoot.co.uk/NUDGE/nudges.php"
    let nudgesURL = NSURL(string: nudgesURLString)

    let session = NSURLSession.sharedSession()

    let task = session.dataTaskWithURL(nudgesURL!, completionHandler: {data, response, error -> Void in

        if error != nil {
            println(error)
        } else {

           let nudgesJSONResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary

            let nudges: NSDictionary = nudgesJSONResult["nudges"] as NSDictionary

            if let list = nudgesJSONResult["nudges"] as? [[String:String]] {
                for nudgeDict in list {
                    let location = nudgeDict["location"]
                    println(location)
                }
            }

        }

    })

    task.resume()

}

【问题讨论】:

  • 它在哪里崩溃? JSON 数据是什么样的?也许它是一个 JSON array 而不是 dictionary?在那种情况下,as NSDictionary 会崩溃(而且这个问题每隔一天就会出现在这里……)
  • 您在可选绑定中将nudgesJSONResult["nudges"] 分配给字典——nudges 和字典数组list(如果让...)。这可能是一些问题的开始,但正如 Martin R 指出的那样,问题是什么并不清楚。
  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。跨度>
  • JSON 数据可以在这里找到:whatthefoot.co.uk/NUDGE/nudges.php。当我 println(nudgesJSONResult) 时,JSON 在 xcode 控制台中输出正常。难以访问嵌套在 API 中的值

标签: arrays json swift dictionary struct


【解决方案1】:

通知

此答案是使用 Swift 1.2 编写的,因此,根据您当前的 Swift 系统,可能需要对答案进行一些细微的风格和语法更改。

答案——Swift 1.2

这一行正在使您的代码崩溃:

let nudges: NSDictionary = nudgesJSONResult["nudges"] as NSDictionary

您正在强制执行 Swift 无法处理的强制转换。你永远不会进入你的 for 循环。

尝试更改您的代码,使其看起来更像这样:

let nudgesURLString = "http://www.whatthefoot.co.uk/NUDGE/nudges.php"
let nudgesURL = NSURL(string: nudgesURLString)

let session = NSURLSession.sharedSession()

let task = session.dataTaskWithURL(nudgesURL!, completionHandler: {data, response, error -> Void in
    if error != nil {
        println(error)
    } else {
        let nudgesJSONResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as [String : AnyObject]
        if let nudges = nudgesJSONResult["nudges"] as? [[String : String]] {
            for nudge in nudges {
                let location = nudge["location"]
                println("Got location: \(location)")
                println("Got full nudge: \(nudge)")
            }
        }
    }

})

task.resume()

【讨论】:

  • 谢谢!这行得通,已经为此苦苦挣扎了好几个小时。以前只使用 NSDictionary 格式的 JSON 数据
  • 您知道将返回的数据存储在自定义 Struct 中的最佳方式吗?
  • 您只需定义结构并将属性分配给每个 nudge 对象的属性,然后将它们添加到数组中。这有意义吗?
  • 努力设置 Struct 以便将值存储在数组中。目前我只能获取位置,例如存储为单个字符串,而不是包含所有位置值的数组
  • 那么,您只需要一组位置吗?如果是这样,您可以执行let locations = (nudges as NSArray).valueForKey("location"),这将是所有位置字符串的数组。确保在 if let nudges = ... 内执行此操作
【解决方案2】:

谢谢,

我创建了以下存储数据的结构,还允许我在视图控制器中为特定索引创建字典。

struct NudgesLibrary {

var location: NSArray?
var message: NSArray?
var priority: NSArray?
var date: NSArray?
var nudges: NSArray?

init(nudgesObject: AnyObject) {

    nudges = (nudgesObject["nudges"] as NSArray)

    if let nudges = nudgesObject["nudges"] as? NSArray {
        location =  (nudges.valueForKey("location") as NSArray)
        message = (nudges.valueForKey("message") as NSArray)
        priority = (nudges.valueForKey("priority") as NSArray)
        date = (nudges.valueForKey("date") as NSArray)

    }
  }
}

【讨论】:

    猜你喜欢
    • 2014-07-31
    • 1970-01-01
    • 2021-04-19
    • 2014-07-29
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    相关资源
    最近更新 更多