Как сохранить / обновить словарь Swift со значением кортежа в plist - PullRequest
0 голосов
/ 17 апреля 2020

Я очень новичок в 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? Заранее благодарим за любую помощь / идеи.

...