Swift Array добавляет не добавляя значения, а заменяя его - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь добавить несколько словарей в массив и сохранить их, используя UserDefaults, но проблема в том, что массив не добавляет новый словарь, а только заменяет словарь.Как я могу решить эту проблему?

вот код:

class Bookmark: NSObject {

     var bookmark: [[String:Any]] = []

    override init() {
        super.init()
    }



    func setBookmark(imageURL:String, title:String, description:String, summary:String, date:String, link:String)  {
        bookmark.append(["imageURL":imageURL , "title":title , "description":description, "summary":summary , "date":date, "link":link])
        UserDefaults.standard.set(bookmark, forKey: "bookmark")

    }


    func getBookrmark() -> [Any] {
        let loadedBookmark = UserDefaults.standard.array(forKey: "bookmark")
        return (loadedBookmark)!
    }

}

Использование класса закладок:

class ReadViewController: UIViewController  {

    var bookmark = Bookmark()


       func save() {
            bookmark.setBookmark(imageURL: nImageURL.absoluteString, title: ntitle!, description: nDescription.htmlToString , summary: nSummary!, date: nDate!, link: nLink.absoluteString)
        }

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Я попытался использовать приведенный выше код с примером, и он работает нормально.

class ViewController: UIViewController {
    let b = Bookmark()

    override func viewDidLoad() {
        super.viewDidLoad()
        b.setBookmark(imageURL: "a", title: "a", description: "a", summary: "a", date: "a", link: "a")
        b.setBookmark(imageURL: "b", title: "b", description: "b", summary: "b", date: "b", link: "b")

        print(b.getBookrmark())
    }
}

Вывод:

[{
    date = a;
    description = a;
    imageURL = a;
    link = a;
    summary = a;
    title = a;
}, {
    date = b;
    description = b;
    imageURL = b;
    link = b;
    summary = b;
    title = b;
}]

Проверьте, если выиспользуя то же самое или что-то еще.

0 голосов
/ 11 февраля 2019

Недостаточно информации, но я могу догадаться, где вы допустили ошибку.

Ваш класс Bookmark не является синглтоном классом, поэтому каждый раз Bookmark() каждый раз создает новый экземпляр.это означает, что он создаст новый bookmark объект для каждого экземпляра.

Я предлагаю вам воспользоваться func func setBookmark(imageURL:String, title:String, description:String, summary:String, date:String, link:String)

Метод 1: Получить последние закладки вотделите переменную и добавьте в нее новый объект и запишите в Default User, а также обновите глобальный объект

Метод 2 Или вы можете сделать его одноэлементным и использовать общий экземпляр при каждом выполнении операции.

Метод 3 Другим решением может быть создание глобального объекта Bookmark в AppDelegate или класса Singleton, а затем использование этого объекта

Однако

func setBookmark(imageURL:String, title:String, description:String, summary:String, date:String, link:String)  {
        bookmark.append(["imageURL":imageURL , "title":title , "description":description, "summary":summary , "date":date, "link":link])
        UserDefaults.standard.set(bookmark, forKey: "bookmark")

  }

Это плохая практика для подражания.Вы непосредственно заменяете Пользовательское значение по умолчанию новым значением, однако вы намерены добавить новый элемент, а не заменить существующие данные в пользовательской ошибке.

Вы должны всегда загружать последнюю версию и обновлять ее. Как показано в методе 1, а также, если вы хотите получить данные в userdefault, ваш глобальный объект var bookmark: [[String:Any]] = [] не используется, потому что у вас уже есть метод getBookrmark

Надеюсь, вам понятно

...