问题描述
我目前正在开发iOS消息应用程序,以提高我的Swift技能,但遇到了一个怪异的问题。我将两个人之间的所有消息都保存在名为“ messages
”的数组中。数据将从FireBase数据库中获取,但目前(我仍在实际布局页面),它们只是保存在设备上的阵列中。顺便说一下,我已经声明了一个名为TextMessage
的类。它只是保留值text: String
和isSender: Bool
。无论如何,我声明我的数组如下:
var messages: [TextMessage] = []
还有一个按钮,它在单击时会调用didPressSendButton
:sendButton.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类型的静态属性。每次调用该对象时,您只需引用同一对象,更改文本,然后在数组中附加对它的引用。因此,您的数组对同一对象的引用越来越多。
具有这样的静态变量可以在结构中使用,但不能用于类,因为它是引用类型。而是将零设为创建新对象的静态函数。