为什么克隆变量仍会影响原始对象?迅速

时间:2015-07-07 15:58:48

标签: ios arrays swift class variables

首先,如果问题标题没有多大意义,请道歉,发现正确地说出来是很棘手的!我对Objective-C非常有信心,但对于一个我不得不接受Swift的新项目(我一直非常担心)。

无论如何,我在一个简单的tableViewController教程中注意到了一些让我发疯的事情。

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

但是在教程制作者的代码中,他使用以下方法更改了特定行的“已检查”属性:

 let item = items[indexPath.row] 
 item.checked = !item.checked

items[indexPath.row]只需在数组items中挑选出所需的对象。这是我感到困惑的地方,当然第一行创建了一个新的克隆对象,它与数组中的对象没有任何其他联系?

然而,在更改任何item的变量时(例如,它如何交换item.checked的状态,该更改应用于ORIGINAL数组对象items[indexPath.row],这只是没有逻辑意义?

当然,我必须实施某种逻辑才能实现这一点,例如:

items[indexPath.row] = item

item的所有更改应用回原始对象?有人可以解释这个显然存在的向后连接吗?

提前谢谢你,希望我只是错过了一些简单的事情!

2 个答案:

答案 0 :(得分:2)

查找值类型和引用类型之间的区别。 基本上你有一个参考类型。所有类都是引用类型。

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

}

当您调用自定义初始化程序而不是标准初始化程序时,每次都会创建单独的实例。

答案 1 :(得分:1)

在Swift中,类是引用类型,因此在这种情况下没有“克隆” - 从数组中检索引用,并修改它指向的实例的属性。见https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html#//apple_ref/doc/uid/TP40014097-CH13-ID89