簡體   English   中英

如何在Swift中從plist讀取多維字符串數組?

[英]How to read a multidimensional String Array from a plist in Swift?

我正在使用以下代碼將2D字符串數組保存到plist中:

func saveFavourites(favouriteStops: [[String]]) {
    let directories = NSSearchPathForDirectoriesInDomains(.libraryDirectory, .userDomainMask, true)

    if let library = directories.first {
        if let libraryUrl = URL(string: library) {
            let favouritesUrl = libraryUrl.appendingPathComponent("favourites.plist")

            // Write favourites to disk
            let favsArray = favouriteStops as NSArray
            print(favsArray)
            favsArray.write(toFile: favouritesUrl.path, atomically: true)
        }
    }
}

上面的代碼片段正確創建了.plist文件(通過查看~/Library/Developer/CoreServices模擬器的文件系統來~/Library/Developer/CoreServices )。 但是,當我嘗試使用以下代碼片段將其讀回到NSArray時,結果為nil

let directories = NSSearchPathForDirectoriesInDomains(.libraryDirectory, .userDomainMask, true)

    if let library = directories.first {
        if let libraryUrl = URL(string: library) {
            let favouritesUrl = libraryUrl.appendingPathComponent("favourites.plist")

            // favsToLoad is nil
            let favsToLoad = NSArray(contentsOf: favouritesUrl)

            // Do stuff with favsToLoad, if it would load properly

        }
    }

您在做兩個非常基本的事情是錯誤的。

  • 首先, 永遠不要通過說URL(string)從文件路徑創建URL(string) 這是磁盤上文件 ,因此您必須使用URL.fileURL

  • 其次,根本不要以文件路徑開頭! 從頭開始獲取目錄作為URL。

  • (此外,盡管我不知道這是否是問題的根源,但不要直接在Library目錄中讀寫。請使用Documents目錄,Application Support目錄或類似目錄。)

因此,例如,我會寫:

let fm = FileManager.default
let docsurl = try fm.url(for:.documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
let favouritesurl = docsurl.appendingPathComponent("favourites.plist")

我明白你的問題。 您拼寫了“收藏夾”。 :)

不過實話說...

Plist只能包含很少的“屬性列表對象”集:(字典,數組,字符串,數字(整數和浮點數),日期,二進制數據和布爾值)。

如果數組的“對象圖”(數組包含的對象以及數組中遞歸包含的所有容器對象)包含上述類型以外的任何內容,則保存將失敗。

老實說,我不知道失敗時會保存什么。 您是否嘗試過在文本編輯器中打開plist文件並進行查看?

我的猜測是,除了字符串以外,其他東西已經插入到您的數組中,這不是上述類型之一,這就是失敗的原因。

暫無
暫無

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

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