簡體   English   中英

如何在Swift中閱讀Plist?

[英]How can I read Plist in Swift?

我想讀一個NSArray表單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;
    }

}

但總是有以下錯誤:

在此輸入圖像描述 在我從plist獲取數據后,我發現我看不到字典的詳細信息:

在此輸入圖像描述

這是我的plist: 在此輸入圖像描述

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

您收到的錯誤消息告訴您方法有什么問題,這就是我編寫函數的方法:

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. 您聲明方法返回Any項的Array ,但您的方法嘗試返回NSArray
  2. 建議使用基於URL的方法來訪問文件,而不是基於字符串的路徑。
  3. 您必須使用Array方法來讀取plist,但您可以將其強制轉換為[Any] 但是,如果您知道plist中的項目類型,我建議您從此方法返回正確類型的數組,例如[String][Int]等。
  4. 如果無法讀取文件,則無需返回可選項。 根據您想要處理錯誤的方式,您可以返回一個空數組(如我在此處所示)或將您的函數轉換為拋出函數,這樣如果您無法讀取該文件,則會拋出錯誤並可以處理通過調用代碼。

您的方法簽名清楚地表明它返回一個[Any] (即包含任何類型元素的Swift本機Array ),同時您嘗試將返回值NSArray轉換為NSArray (即使它已經由於初始化: 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%確定無論你強迫什么都不會失敗並導致運行時錯誤(崩潰)。

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

  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)
        }
    }
     return (arry ) as! [Any]

您不能在Any類型上返回NSArray

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM