2016-04-30 75 views
1

我是Swift新手,無法檢索plist中的信息(請參閱圖像),特別是在迭代內容和比較plist與用戶輸入方面。我有一個Swift:使用for循環從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

+0

不要將代碼發佈爲圖像,將實際文本放回原位,對於plist也是如此 – rmaddy

+0

閱讀錯誤。 'locals'是一個'String',但你試圖像數組一樣迭代它。 – rmaddy

回答

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]] 

您可以修改plist數據或更改代碼。你喜歡哪一個?

+0

謝謝,工作!我現在收到一個錯誤「無法在任何地方嘗試訪問本地值,例如local [」City「],local [」Preference「],而不能使用'String'類型的索引來下標'String'類型的值。 ]。你知道我怎樣才能訪問plist嗎? – leisdorf

+0

'local'是一個數組,而不是一個字典。你可以用一個整數索引來訪問一個值,例如'local [3]' – milesper

+0

你看我的plist數據如果您想使用該代碼訪問它,則結構錯誤。 – ryantxr

-1

您需要定義您所期望的類型。

它看起來像你期待locals是字典(無論是[String: String][String: AnyObject]數組,所以儘量鑄造map["Local"]到(即[[String: String]])。

最後一個的plist是序列化結構化數據的方式。你需要了解你正在處理的結構,然後才能開始工作,然後才能開始工作。