Swift 复制通过的 class 个实例

Swift making copies of passed class instances

我有一个接受 class 实例的初始化(我希望每个人都知道这意味着它是按引用传递)

我希望能够复制对象并将其存储在两个 class 实例变量中,这样,我就有一个函数可以充当 "reset" 它将设置的位置我对某一点所做的任何更改都会恢复到以前的状态。

所以像这样:

convenience init(_ item:Item?){
    self.init()
    self.item = item
    self.undoItem = item
}


func reset(){
    self.item = self.undoItem
    self.reloadInfo()
}

我应该是一个相对直接的解决方案,但没有取得太大的成功。我对 Swift 和 iOS 开发太陌生了。

使用 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.value1item2.value20。 以下行创建了 item1 的副本并将其分配给 item2:

var item2 = item1

从这一行开始,对 item2 的任何更改都不会反映在 item1 中。

结论

您的问题可以通过将 Item 定义为 struct

来解决

在 playground 中(在朋友的帮助下)写了以下内容:

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 中获取我的 class 个实例的副本。在 swift 中,由于它们是引用类型(我不确定您是否可以取消引用它或诸如此类),您基本上每次都必须为您的对象编写一个自定义复制函数。好吧,现在我写了这个,所以只要你使用 NSObject 的子class 并使用这个协议,你就可以了。

这完全符合我在代码中的需要