Swift:使用for循环从plist中检索数据

时间:2016-04-30 23:05:21

标签: ios swift plist

我是Swift的新手,我在检测plist中的信息时遇到了问题(参见图片),特别是在迭代内容和比较plist与用户输入方面。我有一个

  

“类型'字符串'不符合协议'序列类型'

我的代码中出现

错误。

func matchTraveller(location: Destination, preference: TravellingPreference) -> String{
    var message = ""
    if let path = NSBundle.mainBundle().pathForResource("Locals", ofType: "plist"){
        if let map = NSDictionary(contentsOfFile: path){
            if let locals = map["Local"] as? String {
                for local in locals{ // <-- ERROR HERE
                    let city = local["City"]
                    if local["City"] == location {
                        message = "We have matched you with \(local) in \(city)."
                    } else{
                        message = "Apologies, there aren't any locals registered in \(city) on LocalRetreat. Try again soon!"
                        break
                    }
                    if local["Preference"] == preference{
                        let prefer = local["Preference"]
                        message += "\(local) is also a \(prefer)"
                    }
                    return message
                }
            }
        }

    }
}

Code

Plist

2 个答案:

答案 0 :(得分:2)

你告诉Swift locals是一个字符串。我认为您的意思是将其定义为[String]

if let locals = map["Local"] as? String {

更改为:

if let locals = map["Local"] as? [String] {

您的plist数据与代码不符。 plist中的内容是String数组的字典。

[String: [String]]

代码试图以字符串数组的字典来访问它:string。

[String: [String: String]]

您可以修改plist数据或更改代码。你想要哪一个?

答案 1 :(得分:-1)

您需要定义您期望的类型。

您好像希望locals成为一系列词典([String: String][String: AnyObject],因此请尝试将map["Local"]投射到该词典(即{ {1}})。

最终,plist是一种序列化结构化数据的方法。在开始工作之前,您需要了解您正在处理的结构。