首先,如果问题标题没有多大意义,请道歉,发现正确地说出来是很棘手的!我对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
的所有更改应用回原始对象?有人可以解释这个显然存在的向后连接吗?
提前谢谢你,希望我只是错过了一些简单的事情!
答案 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