[英]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.