2017-08-25 71 views
1

我想讀的NSArray形式的plist,代碼:如何在Swift中讀取Plist?

func loadPlistArray() -> [Any] { 

    var path: String? = Bundle.main.path(forResource:"MyCenter", ofType: "plist") 

    if let arry = NSArray(contentsOfFile: path!) { 
     return arry as! NSArray 
    }else{ 
     return nil; 
    } 

} 

但總是有以下錯誤:

enter image description here 而我從plist中的數據後,我發現用我看不到詞典的詳細信息:

enter image description here

這裏是我的plist: enter image description here

我應該通過var plistArray在數組中添加一個泛型:[[String:Any]]?

+0

函數的返回類型是'[Any]',並且您非常感謝'NSArray' –

回答

1

你的方法簽名中明確指出,它返回一個[Any](任何類型的任何的即斯威夫特本地Array包含元素),而你試圖返回值的類型轉換成NSArray(即使它已經憑藉intialization的:NSArray(contentsOfFile:) )。

將其更改爲:

return arry as? [Any] 
// (will return nil if the cast fails - not a problem if you 
// also apply the fix mentioned below...) 

其他路徑試圖返回nil;爲實現這一目標是可以接受的,您的簽名需要被定義爲返回一個可選

func loadPlistArray() -> [Any] // WRONG 

func loadPlistArray() -> [Any]? // RIGHT 

編輯:如果您的應用程序以這樣一種方式,你不能從返回nil結構的方法,可以改爲在失敗時返回一個空數組:

else { 
    return [] // Empty array 
} 

(使用[:]空字典)


另外,儘量避免使用!只要有可能,並切換到?替代,除非你是100%肯定不管它是你正在迫使不會失敗,並導致運行時錯誤(崩潰)。

+0

。我是新來的,可選類型真的讓我有些困惑。 – Neko

0

我在我的項目中使用類似這樣的東西。

if let fileUrl = Bundle.main.url(forResource: "new", withExtension: "plist"), 
    let myDict = NSDictionary(contentsOf: fileUrl) as? [String:Any] { 
      print(myDict) 
     } 

我有另一個顏色的plist,它有一個數組作爲根。

 if let fileUrl = Bundle.main.url(forResource: "color", withExtension: "plist"), 
     let data = try? Data(contentsOf: fileUrl) { 
     if let result = try? PropertyListSerialization.propertyList(from: data, options: [], format: nil) as? [Any] { 
      print(result) 
     } 
    } 
+0

還感謝,但我的根值是一個數組 – Neko

+0

@Neko這裏是數組 –

0
 return (arry) as! [Any] 

您不能在類型返回NSArray的你正在告訴你什麼是錯的方法的任何

2

的錯誤訊息,這是我會怎麼寫功能:

func loadPlistArray() -> [Any] { // 1 
    guard 
     let url = Bundle.main.url(forResource: "MyCenter", withExtension: "plist"), // 2 
     let list = NSArray(contentsOf: url) as? [Any] // 3 
     else { return [] } // 4 

    return list 
} 

還有一些解說:

  1. 你在聲明方法返回AnyArray項目,但你的方法試圖返回NSArray
  2. 建議使用基於URL的方法來訪問文件,而不是基於字符串的路徑。
  3. 您必須使用Array方法來讀取plist中,但可以將其轉換爲[Any]。但是,如果您知道plist中的項目類型,我建議您從此方法返回正確類型的數組,例如[String][Int]
  4. 你並不需要返回一個可選的,如果該文件無法讀取。根據您要如何處理,你既可以返回一個空數組錯誤(我在這裏顯示)或轉換你的函數成拋出一個因此,如果您不能讀取引發錯誤的文件,並可以處理由調用代碼。