了解如何将解析数据添加到字典(Swift)

时间:2015-08-13 16:30:10

标签: swift dictionary

我认为这可能是一个基本问题,但我很难在Swift中掌握词典的概念。我正在尝试获取基于XML的Web服务的内容,解析两个特定字段并将它们设置为字符串(一个名为“fileName”,一个名为“fileType”),然后将这些字符串添加到字典中(让我们调用字典“文件”)。我希望以后能够在我的应用中打印files.fileName!files.fileType!来引用给定的实例。

以下是我正在使用的代码;

//MARK
func getData(theURL: String) {

    //Define the passed string as a NSURL
    let url = NSURL(string: theURL)

    //Create a NSURL request to get the data from that URL
    let request = NSURLRequest(URL: url!, cachePolicy: .ReloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 5.0)

    //Begin the NSURL session
    let session = NSURLSession.sharedSession()

    session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in

        let xml = SWXMLHash.parse(data!)

       //I think this is wrong
        var files = [String]()

        for elem in xml["XmlResponse"]["object"] {
            let fileName: String? = elem.element?.attributes["name"]!
            let fileType: String? = elem.element?.attributes["type"]!

            //I also think this is wrong
            let file = String(fileName: fileName, fileType: fileType)
            self.files.append(file)

            print(self.files)

            dispatch_async(dispatch_get_main_queue()) {
                self.tableView.reloadData()
            }   
        }
    }).resume()
}

在上一次迭代中,我使用var files = [FileData]() FileData 是我创建的自定义类,用于保存fileName和fileType字符串。这是唯一的方法吗?我觉得好像错过了一个简单的前提;我知道如何收集数据(以及XML解析 工作),但我不太清楚如何将它添加到一个简单的字典中,以后可以调用。

谢谢!

2 个答案:

答案 0 :(得分:0)

使用var files = [String]()创建的是数组,而不是字典。 要在Swift中获得所需内容,您需要创建一个Dictionary,然后使用下标语法添加键值对:

var files = [String: String]()
...
files["fileName"] = fileName
files["fileType"] = fileType

要访问Dictionary,您可以使用相同的下标语法:

if let fileName = files["fileName"] {
  ...
}

答案 1 :(得分:0)

字典是从键到值的映射。在您的情况下,您有密钥fileNamefileType。并且您希望在这些键下存储实际文件名和文件类型,以便您可以使用各自的键访问它们。这比我能做的好explained by Apple

以下代码应该做你想要的:

// Defining the dictionary and initializing an empty dictionary.
var files: [String: String] = [String: String]()

func getData(theURL: String) {
  // snipped a lot of your code

  //I think this is wrong
  var files = [String]() // Yes, this is wrong! See above.

  for elem in xml["XmlResponse"]["object"] {
    let fileName: String? = elem.element?.attributes["name"]!
    let fileType: String? = elem.element?.attributes["type"]!

    // Here you store your values in the dictionary
    files["fileName"] = fileName
    files["fileType"] = fileType

    print(self.files)

    dispatch_async(dispatch_get_main_queue()) {
      self.tableView.reloadData()
    }   
  }
}

您可以访问以下值:

let actualFileName = files["fileName"]
let actualFileType = files["fileType"]