斯威夫特复印
问题描述:
我有一个初始化,在一个类的实例需要(我希望每个人都知道这意味着它的传递通过引用)斯威夫特复印
我希望能够复制对象并存储在两个类的实例变量上,这样,我有一个函数可以用作“重置”,它将设置我对某个点所做的任何更改,回到之前的状态。
所以像:
convenience init(_ item:Item?){
self.init()
self.item = item
self.undoItem = item
}
func reset(){
self.item = self.undoItem
self.reloadInfo()
}
我没有什么应该是一个比较直接的解决方案很成功。我对Swift和iOS开发太新了。
答
来解决写了操场以下(与一个朋友的帮助下):
protocol Copyable {
func copyOfValues() -> AnyObject
}
extension Copyable where Self: NSObject {
func copyOfValues() -> AnyObject{
var copyOfOriginal = Self()
let mirror = Mirror(reflecting: self)
for (label, value) in mirror.children {
if let label = label {
copyOfOriginal.setValue(value, forKey: label)
}
}
return copyOfOriginal
}
}
class Test: NSObject, Copyable {
var a = 1
var b = 2
}
var test = Test()
var copy = test.copyOfValues() as! Test
print(dump(test))
print(dump(copy))
copy.a = 10
print(dump(test))
print(dump(copy))
这是一个好的和简单的功能,以便我可以快速获取我的类实例的副本。在swift中,因为它们是一个引用类型(并且我不确定是否可以解引用它或什么),所以基本上每次都必须为对象编写一个自定义的复制函数。好吧,现在我写了这个,所以只要你使用NSObject的一个子类并使用这个协议,你就会好起来的。
这已经完全按照我的需要在我的代码中工作
答
使用swift结构可能是您的一个选择。
struct Item {
//
}
Swift中的结构是值类型,它们是通过值而不是引用复制的。
例
struct Item {
var value: Int = 1
}
var item1 = Item()
var item2 = item1
item2.value = 20
print("\(item1.value)") // 1
print("\(item2.value)") // 20
在上面的例子是item1.value
和1
是item2.value
20
。 下面行创建的ITEM1副本,并把它分配给ITEM2:
var item2 = item1
从该线到item2
任何变化不会反映在item1
。
结论
您的问题可以通过定义Item
为struct
这两种方法在哪些类中?使用这些方法演示问题的示例代码更新您的问题。说明代码实际发生了什么,以及你想要发生什么。 – rmaddy
我不明白为什么这很难理解。我想知道如何能够将项目的副本传递给init,以便我可以将它存储到两个不同的位置,以便它们不共享相同的引用。这会让我对其中的一个进行更改,如果用户决定撤消这些更改,则可以使用重置功能来实现此功能。 – daredevil1234
确保'Item'有一个复制初始值设定项,并使用它。请注意,如果您没有进行深层复制,如果任何属性都是引用类型,则可能仍然存在问题,因为如果制作浅度副本,则会有两个不同的“Item”对象,但它们都会引用到其引用类型成员变量的相同实例。 –