Я очень новичок в Swift. Итак, мои извинения, если мой код кажется странным и / или неэффективным. Я пытаюсь сохранить словарь со значением, являющимся кортежем, в plist, но получаю следующую ошибку:
Ошибка домена = NSCocoaErrorDomain Code = 3851 "Список свойств недопустим для формата: 100 (списки свойств не могут содержать объекты типа 'CFType') "UserInfo = {NSDebugDescription = Список свойств, недопустимый для формата: 100 (списки свойств не могут содержать объекты типа 'CFType')}
Структура словаря выглядит следующим образом:
let dictionary = ["id1" : (movieTitle: "movie1", movieYear: "2000", movieRating: "5 stars"),
"id2" : (movieTitle: "movie2", movieYear: "2001", movieRating: "4 stars"),
"id3" : (movieTitle: "movie3", movieYear: "2002", movieRating: "1 stars"),]
Код, который я пытаюсь использовать, чтобы сделать все это, выглядит следующим образом: (сейчас это все в одном классе)
var plistURL5: URL {
let folderName = "SwiftPGs/Movies"
let fileManager = FileManager.default
let documentsFolder = try! fileManager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
let folderURL = documentsFolder.appendingPathComponent(folderName)
var kmfileURL = folderURL.appendingPathComponent("kmTemp.txt")
let folderExists = (try? folderURL.checkResourceIsReachable()) ?? false
do {
if !folderExists {
try fileManager.createDirectory(at: folderURL, withIntermediateDirectories: false)
}
let fileURL = folderURL.appendingPathComponent("dictionary.plist")
kmfileURL = fileURL
} catch { print(error) }
return kmfileURL
}
func savePropertyList(_ plist: Any) throws
{
let plistData = try PropertyListSerialization.data(fromPropertyList: plist, format: .xml, options: 0)
try plistData.write(to: plistURL5)
}
func loadPropertyList() throws -> [String:String]
{
let data = try Data(contentsOf: plistURL5)
guard let plist = try PropertyListSerialization.propertyList(from: data, format: nil) as? [String:String] else {
return [:]
}
return plist
}
func kmCreatePlist () {
//.. Create the dictionary and save it
do {
//let dictionary = ["key1" : "value1", "key2":"value2", "key3":"value3"]
let dictionary = ["id1" : (movieTitle: "movie1", movieYear: "2000", movieRating: "5 stars"),
"id2" : (movieTitle: "movie2", movieYear: "2001", movieRating: "4 stars"),
"id3" : (movieTitle: "movie3", movieYear: "2002", movieRating: "1 stars"),]
try savePropertyList(dictionary)
} catch {
print(error)
print("plist create error - createPlist")
}
}
func kmUpdatePlist () {
//.. To update a value read it, update the value and save it back
do {
var dictionary = try loadPropertyList()
dictionary.updateValue("no idea what to put here because it's a tuple :(", forKey: "id1")
try savePropertyList(dictionary)
} catch {
print(error)
print("plist update error - updatePlist")
}
}
Кажется, я сразу же получаю сообщение об ошибке, когда пытаюсь выполнить kmCreatePlist. Кроме того, я понятия не имею, как обновить plist. Нельзя ли иметь словарь со значением кортежа в plist? Заранее благодарим за любую помощь / идеи.