【问题标题】:Swift Array append not appending values but replacing itSwift Array append 不是附加值而是替换它
【发布时间】:2019-02-11 12:32:52
【问题描述】:

我正在尝试将一些字典添加到数组中并使用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)
        }

【问题讨论】:

  • 调试问题了吗? bookmark 在您向其附加内容之前和之后包含什么? – 我的猜测:您创建 Bookmark 类的新实例(以空数组开头)。
  • @MartinR 正确:) 我已经尝试回答了
  • 显示您正在创建Bookmark 对象并调用其方法的代码。我试过了,它工作得很好。

标签: ios arrays swift dictionary nsarray


【解决方案1】:

没有足够的信息,但我可以猜出你在哪里犯了错误。

您的课程Bookmark 不是单例 课程,所以每次Bookmark() 每次都创建新实例。这意味着它将为每个实例创建新的bookmark 对象。

我建议你在 func func setBookmark(imageURL:String, title:String, description:String, summary:String, date:String, link:String)

方法1:在单独的变量中获取最新的书签并在其中添加新对象并写入用户默认值以及更新全局对象

方法二 或者你可以把它做成单例,每次操作都使用共享实例。

方法 3 另一种解决方案是在 AppDelegate 或您的单例类中创建 Bookmark 的全局对象,然后使用该对象

然而

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 方法

希望你清楚

【讨论】:

  • @Mc.Lover 当您遇到问题时。在 ViewDidLoad 方法中尝试ReadViewController 中的一件事,调用保存几次并检查
  • 方法1有效,我只需要在append之前添加这一行:bookmark = getBookrmark() as! [[String : Any]]
【解决方案2】:

我已经尝试将上面的代码与示例一起使用,并且它工作得很好。

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;
}]

检查您是否使用相同的方式或其他方式。

【讨论】:

  • 我不明白你到底想说什么,。
  • 我的意思是添加一个带有b 值的字典,它只保存并用b 替换字典。不是ab
  • 那么你的代码可能有问题。请添加更多代码,以便我可以解决问题。
猜你喜欢
  • 2017-04-20
  • 1970-01-01
  • 2014-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 2015-02-05
  • 2018-01-19
相关资源
最近更新 更多