【问题标题】:Stopping reference variables changing the value of the original variable停止参考变量改变原始变量的值
【发布时间】:2017-06-08 08:42:22
【问题描述】:

我将自定义类的值分配给另一个变量。更新新变量的值会影响原始变量的值。但是,我需要阻止引用变量更新原始变量。

这是正在发生的事情的基本表示:

var originalVariable = CustomClass()

originalVariable.myProperty = originalValue

var referenceVariable = originalVariable 

referenceVariable.myProperty = updatedValue

print("\(originalVariable.myProperty)") //this prints the ->updatedValue<- and not the ->originalValue<-

我尝试将 referenceVariable 包装在一个结构中以使其成为值类型,但它并没有解决问题。

我找到了有关值和引用类型的信息,但我找不到解决方案。

简而言之我的问题:如何停止对引用变量的更新,使其不再更新从其获得其值的原始变量?

提前致谢。

【问题讨论】:

  • 不使用自定义类的类,你能把它变成一个结构吗?问题是一个类是一个引用,当你做 var reference = originalVariable 你只是创建一个对 originalVariable 的引用而不是一个副本。
  • 这就是使类成为类的原因,如果您不希望使用此指针功能,请改用 Struct
  • 感谢您的回复。我尝试将 CustomClass 更改为结构,这已经解决了这个问题。我曾尝试将引用变量放在一个结构中,但是,这并没有奏效。我尝试使用 NSObject 方法,但似乎无法在 CustomClasses 数组上调用复制方法,因此它不适用于我正在处理的项目。但是,我认为还有其他方法可以复制数组。干杯。

标签: swift swift-structs pass-by-reference-value


【解决方案1】:

整个引用语义点(如类所使用的)是所有变量都指向内存中的相同(即它们引用相同)对象。如果您不想要这种行为,您应该使用值类型(Struct、Enum、Array...)或创建对象的副本。

如果CustomClass 实现了NSCopying 协议,您可以这样做:

var referenceVariable = originalVariable.copy()

如果没有,您将不得不寻找其他方法来复制它或自己实现协议。

将类包装在结构中只会创建两个不同的结构,每个结构都包含对同一对象的不同引用。

【讨论】:

  • 感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 2013-03-06
  • 1970-01-01
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多