Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么克隆变量仍然影响原始对象?敏捷的_Ios_Arrays_Swift_Class_Variables - Fatal编程技术网

Ios 为什么克隆变量仍然影响原始对象?敏捷的

Ios 为什么克隆变量仍然影响原始对象?敏捷的,ios,arrays,swift,class,variables,Ios,Arrays,Swift,Class,Variables,首先,如果问题标题没有多大意义,我道歉,因为我发现很难正确表达!我对Objective-C很有信心,但对于一个新项目,我不得不接受Swift(这是我一直很担心的事情) 无论如何,我在一个简单的tableViewController教程中发现了一些让我发疯的东西 首先,为每一行设置一个新类,其中包含“text”和“checked”变量。然后,数组由此类的对象组成,以填充表行 但在tutorial maker的代码中,他使用以下命令更改特定行的“checked”属性: let item = ite

首先,如果问题标题没有多大意义,我道歉,因为我发现很难正确表达!我对Objective-C很有信心,但对于一个新项目,我不得不接受Swift(这是我一直很担心的事情)

无论如何,我在一个简单的tableViewController教程中发现了一些让我发疯的东西

首先,为每一行设置一个新类,其中包含“text”和“checked”变量。然后,数组由此类的对象组成,以填充表行

但在tutorial maker的代码中,他使用以下命令更改特定行的“checked”属性:

 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")
    }

}
当您调用自定义初始化器而不是标准初始化器时,每次都将创建单独的实例