Ios Swift数组append不追加值,而是替换值

Ios Swift数组append不追加值,而是替换值,ios,arrays,swift,dictionary,nsarray,Ios,Arrays,Swift,Dictionary,Nsarray,我试图将一些字典添加到数组中,并使用UserDefaults保存它,但问题是数组没有追加新字典,而只是替换字典。如何解决此问题 代码如下: class Bookmark: NSObject { var bookmark: [[String:Any]] = [] override init() { super.init() } func setBookmark(imageURL:String, title:String, descript

我试图将一些字典添加到数组中,并使用
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
不是singleton类,因此,每次
Bookmark()
都要创建新实例。这意味着它将为每个实例创建新的
书签
对象

我建议您在func
func setBookmark(imageURL:String,title:String,description:String,summary:String,date:String,link:String)中使用

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

方法2或者您可以将其设置为单例,并在每次执行操作时使用共享实例

方法3另一个解决方案是在
AppDelegate
或您的singleton类中创建
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 show一样更新它,如果您想在userdefault中获取数据,那么您的全局对象
var bookmark:[[String:Any]]=[]
就没有用处了,因为您已经有了
getbookmark
方法


希望您清楚

我已尝试将上述代码与一个示例一起使用,其工作完全正常

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

检查您是否使用相同的方法或任何其他方法。

您是否调试了该问题?
bookmark
在添加内容之前和之后包含哪些内容我猜:您创建了Bookmark类的新实例(以空数组开头)。@MartinR Correct:)我试图回答它,您创建
Bookmark
对象并调用其方法的代码。我试过了,效果非常好。@Mc.Lover当你遇到问题时。在ViewDidLoad方法调用save多次,并检查方法1是否有效,我只需要添加以下行:
bookmark=getBookrmark()as![[String:Any]
append
之前,我不明白你到底想说什么。我的意思是添加一个带有
b
值的字典,它只保存字典并用
b
替换字典。不是
a
b
那么您的代码可能有问题。请添加更多代码,以便我可以告诉问题,。