代码之家  ›  专栏  ›  技术社区  ›  lithium

不同uiviewcontroller中变量的奇怪行为

  •  0
  • lithium  · 技术社区  · 7 年前

    我有两个uiviewcontroller( Master Detail 简单地说。在我的 Master Controller 我有一个 tableView 有一些对象列表,我正在使用 Detail Controller 显示详细信息并更改这些对象的某些属性。

    它看起来非常简单明了。

    假设我有一个这样结构的对象:

    class User {
       var name = ""
       var lastPoints:[LastPoint] = []
     }
    

    在我的 主控制器 我将显示用户列表,并在 细节控制器 我想移除 lastPoints 是的。

    所以在 didSelectRowAt 我的 主控制器 我有:

    let suVC = ShowUserViewController()
    suVC.currentUser = self.usersToShow[indexPath.row]
    self.navigationController?.pushViewController(suVC, animated: true)
    

    在那之后,我可以在 细节控制器 .例如,我可以删除 currentUser 是的。

    问题是,这个 lastPoint 将立即从 self.usersToShow[indexPath.row] 主控制器 同时,我需要避免这种情况(我也想知道这种行为的原因是什么:是的,对大多数情况来说,这似乎是合乎逻辑的,甚至是方便的,但我记不起以前的项目中有过这种行为)。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Shehata Gamal    7 年前

    原因很简单,类数组是引用类型,所以将其更改为

    struct User {
       var name = ""
        var lastPoints:[LastPoint] = []
    }
    

    在哪里? struct 是值类型

        2
  •  2
  •   Tim    7 年前

    这是因为用户是一个类,它是 参考类型 在斯威夫特。当您的detail控制器获取当前用户时,它将共享对与主控制器中所示完全相同的用户实例的引用。因为它是同一个用户,所以 lastPoints 两个地方都会反映出来。