Ios 为什么克隆变量仍然影响原始对象?敏捷的
首先,如果问题标题没有多大意义,我道歉,因为我发现很难正确表达!我对Objective-C很有信心,但对于一个新项目,我不得不接受Swift(这是我一直很担心的事情) 无论如何,我在一个简单的tableViewController教程中发现了一些让我发疯的东西 首先,为每一行设置一个新类,其中包含“text”和“checked”变量。然后,数组由此类的对象组成,以填充表行 但在tutorial maker的代码中,他使用以下命令更改特定行的“checked”属性:Ios 为什么克隆变量仍然影响原始对象?敏捷的,ios,arrays,swift,class,variables,Ios,Arrays,Swift,Class,Variables,首先,如果问题标题没有多大意义,我道歉,因为我发现很难正确表达!我对Objective-C很有信心,但对于一个新项目,我不得不接受Swift(这是我一直很担心的事情) 无论如何,我在一个简单的tableViewController教程中发现了一些让我发疯的东西 首先,为每一行设置一个新类,其中包含“text”和“checked”变量。然后,数组由此类的对象组成,以填充表行 但在tutorial maker的代码中,他使用以下命令更改特定行的“checked”属性: let item = ite
let item = items[indexPath.row]
item.checked = !item.checked
其中items[indexPath.row]
只是在数组items
中选择所需的对象。这就是我感到困惑的地方,第一行肯定创建了一个新的克隆对象,而该对象没有以其他方式链接到数组中的对象
但是,当更改项的任何变量时(例如,它如何交换项的状态。选中的该更改将应用于原始数组对象项[indexPath.row]
,这在逻辑上没有意义
当然,我必须实现某种逻辑才能实现这一点,例如:
items[indexPath.row] = item
要将对项的所有更改
应用回原始对象,请有人解释一下明显存在的向后连接吗
提前感谢您,希望我错过了一些简单的东西!在Swift中,类是引用类型,因此在本例中没有“克隆”-从数组中检索引用,并修改它指向的实例的属性。请参阅Swift中的,类是引用类型,因此在本例中没有“克隆”-请参阅从数组中检索引用,并修改其指向的实例的属性。请参见查找值类型和引用类型之间的差异。
基本上你有一个引用类型。所有的类都是引用类型
//new class init
var myClassInstance : MyClass = MyClass()
// this creates a new reference to the original object
// changes will also happen to the original
var myClone = myClassInstance
例如,结构是值类型。
这些复制值不绑定到原始值
解决方法:
您可以创建一个自定义初始化器,它从原始类中获取所有必要的值
class MyCustomImageView : UIImageView {
override init(frame: CGRect) {
super.init(frame: frame)
}
init(uiImageView_I : UIImageView) {
super.init(frame:uiImageView_I.frame)
self.image = uiImageView_I.image
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
调用自定义初始化器而不是标准初始化器时,每次都将创建单独的实例。查找值类型和引用类型之间的差异。
基本上你有一个引用类型。所有的类都是引用类型
//new class init
var myClassInstance : MyClass = MyClass()
// this creates a new reference to the original object
// changes will also happen to the original
var myClone = myClassInstance
例如,结构是值类型。
这些复制值不绑定到原始值
解决方法:
您可以创建一个自定义初始化器,它从原始类中获取所有必要的值
class MyCustomImageView : UIImageView {
override init(frame: CGRect) {
super.init(frame: frame)
}
init(uiImageView_I : UIImageView) {
super.init(frame:uiImageView_I.frame)
self.image = uiImageView_I.image
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
当您调用自定义初始化器而不是标准初始化器时,每次都将创建单独的实例