.append更改Swift数组中添加的元素

问题描述

我目前正在开发iOS消息应用程序,以提高我的Swift技能,但遇到了一个怪异的问题。我将两个人之间的所有消息都保存在名为“ messages”的数组中。数据将从FireBase数据库获取,但目前(我仍在实际布局页面),它们只是保存在设备上的阵列中。顺便说一下,我已经声明了一个名为TextMessage的类。它只是保留值text: StringisSender: Bool。无论如何,我声明我的数组如下:

var messages: [TextMessage] = []

还有一个按钮,它在单击时会调用didPressSendButtonsendButton.addTarget(self,action: #selector(didPressSendButton),for: .touchUpInside)

函数定义如下:

@objc func didPressSendButton() {
    
    guard let messageText = textField.text else {
        return
    }
    
    if messageText == "" {
        return
    }
    
    let newMessage: TextMessage = TextMessage.zero
    newMessage.text = messageText
    newMessage.isSender = true
    messages.append(newMessage)
    
    messageTable.reloadData()
    scrollToBottom()
    updateUI()
    
    textField.text = ""
    
}

由于某种原因,append方法更改了数组中的 all 个元素。因此,如果我先发送一条带有“ Hi”文本的消息,然后再发送一个hey”消息,则第一个消息将被更改。我已经打印了数组的值,并且肯定地,它保存了两条消息,文本为“ hey”,而不是1“ Hi”和1“ hey”。可能是什么原因造成的?

解决方法

附加应该正常工作。在我看来,TextMessage.zero是TextMessage类型的静态属性。每次调用该对象时,您只需引用同一对象,更改文本,然后在数组中附加对它的引用。因此,您的数组对同一对象的引用越来越多。

具有这样的静态变量可以在结构中使用,但不能用于类,因为它是引用类型。而是将零设为创建新对象的静态函数。