Swift - 如何遍历 NSDictionary

Posted

技术标签:

【中文标题】Swift - 如何遍历 NSDictionary【英文标题】:Swift - How to loop through NSDictionary 【发布时间】:2014-07-15 17:44:00 【问题描述】:

您好,我目前正在学习 Swift,我想从 JSON Api 中提取数据,我的 Swift 代码如下所示。具体来说,我需要提取每个键及其值,(例如:打印标题、封面等的值。)

//Json request
var error: NSError?
var raw = NSString.stringWithString("http://example.com/MovieAPI/api/v1/movies/")
var api_url = NSURL.URLWithString(raw)
let jsonData: NSData = NSData.dataWithContentsOfURL(api_url, options: nil, error: &error)
let result = NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: &error)
as NSDictionary
for val in result 
   for (var i=0; i < val.value.count; i++)
       //println(val.value.valueAtIndex(3)) Not Working
   

我的 JSON 结构是


  data: [
      
        id: 2,
        title: "Hunger Games",
        cover: "http://example.com",
        genre: 2
       
  ]

救命!

【问题讨论】:

已经通过了这个链接,这个链接的解决方案给了我一个 NIL 的返回值和一个错误 Type 不符合协议序列 所以你问错了问题。我重新打开了它。假定的副本是Iterating through a dictionary in Swift 【参考方案1】:

以下是处理给定 JSON 的方法:

let dataArray = result["data"] as NSArray;

print("Data items count: \(dataArray.count)")

for item in dataArray  // loop through data items
    let obj = item as NSDictionary
    for (key, value) in obj 
        print("Property: \"\(key as String)\"")
    

备注:

请记住,您接收解析后的对象为NSDictionary,并且当您遍历字典时,您接收属性的顺序可能与原始 JSON 中的顺序不同。

【讨论】:

谢谢!有用!还有一个问题,这个声明是否正确?让 result = NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: &error) 作为 NSDictionary,因为它会造成内存泄漏 泄露了什么jsonDataresult 嗯……这很有趣。你能在某个地方分享一个稳定重现内存泄漏的示例项目吗? 现在它的工作没有任何问题(在这之间我已经将我的 xcode 更新到 beta 5),我认为这解决了我的问题。 是的,swift 仍然是测试版,所以我们可能会遇到一些奇怪的漏洞。很高兴问题解决了! :)【参考方案2】:

查看这段代码以供参考:

// MARK: - Firebase
func retrieveData()
    ref.observe(FIRDataEventType.value, with:  (snapshot) in
        let postDict = snapshot.value as! [String : AnyObject]
        let contactList = postDict["contacts"]!
        let user = FIRAuth.auth()!.currentUser

        let contactArray = contactList[user!.uid]! as! NSDictionary

        for (key,_) in contactArray 

            let contact:NSObject = contactArray[key] as! NSObject
            let firstName:String! = contact.value(forKey: "firstName") as? String
            let lastName:String! = contact.value(forKey: "lastName") as? String
            let company:String! = contact.value(forKey: "company") as? String
            let phone:String! = contact.value(forKey: "phone") as? String
            let email:String! = contact.value(forKey: "email") as? String

            print(contact.value(forKey: "firstName")!)
            contacts.append(Contact(firstName:firstName, lastName: lastName, company: company, phone: phone, email: email))
        
        self.tableView.reloadData()

    )


当您将键值解析为可用的对象时,它会变得特别棘手,这是 NSObject 来救援的地方,以便您可以获取键的值。

【讨论】:

以上是关于Swift - 如何遍历 NSDictionary的主要内容,如果未能解决你的问题,请参考以下文章

如何返回数据类型:Swift 中的 NSDictionary

Swift:遍历 plist

如何在 Swift 中从 NSDictionary 生成 JSON 数据

如何将 swift Dictionary 转换为 NSDictionary

如何在 Swift 中制作动态 NSDictionary

如何在 swift 中使用 NSDictionary 访问 JSON 子字段