【问题标题】:.append changes added elements in Swift array.append 更改 Swift 数组中添加的元素
【发布时间】:2020-12-01 14:25:42
【问题描述】:

我目前正在开发一款适用于 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 方法更改了数组中的 所有 元素。因此,如果我先发送一条带有文本“Hi”的消息,然后再发送一条消息“Hey”,那么第一个消息就会改变。我已经打印了数组的值,果然,它包含两条消息,文本为“Hey”,而不是 1 条“Hi”和 1 条“Hey”。这可能是什么原因?

【问题讨论】:

  • 什么是TextMessage.zero?我怀疑这是一个存储属性,它每次都返回相同的 TextMessage 实例,而您正在一遍又一遍地修改它。

标签: ios arrays swift append


【解决方案1】:

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

像这样的静态变量可以在结构中工作,但不能在类中工作,因为它是引用类型。相反,将零设为创建新对象的静态函数。

【讨论】:

  • 或者只是确保属性是计算属性而不是存储属性。
  • 太棒了!我将“零”作为 TextMessage 类的扩展,以使其完全初始化,但作为稍后出现的值的占位符。现在我把它改成一个静态函数,它工作得很好。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2018-04-28
  • 2014-07-23
  • 1970-01-01
  • 1970-01-01
  • 2018-08-16
  • 2020-04-07
  • 1970-01-01
相关资源
最近更新 更多