在swift3中将一个对象的属性分配给另一个对象(尝试实现复制功能)的最佳方法

San*_*ari 6 mirror swift3

我正在尝试深度复制Swift类实例.由于copymutableCopy函数仅适用于NSObject类后代,我需要为Swift类对象实现我自己的copy函数.

这是我做的,

protocol Copying {
    init(original: Self)
}

extension Copying {
    func copy() -> Self {
        return Self.init(original: self)
    }
}

class A : Copying {
    var name : String? = nil
    var age : Int? = nil
    var address : String? = nil

    init(name : String) {
        self.name = name
    }

    required init(original: A) {
        //one way
        self.name = original.name
        self.age = original.age
        self.address = original.address

        //second way
        let originalReflect = Mirror(reflecting: original)
        let selfReflect = Mirror(reflecting: self)
         for (_, originalAttr) in originalReflect.children.enumerated() {
            for (_, attr) in selfReflect.children.enumerated() {
                if originalAttr.label == attr.label {
                    //now I know the value of property and its value as well in original
                    //but how will I set it to self?
                    //If A was NSObject I could have said
                    self.setValue(originalAttr.value, forKey: originalAttr.label!)


                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,这是我访问副本的方式

let aInstance = A(name: "Sandeep")
let aCopy = aInstance.copy()
Run Code Online (Sandbox Code Playgroud)

显示的第一种方法required init(original: A)非常好,但不可扩展.在我的项目中,我有50个奇数属性的基类和50个以上的子类.现在我不能required init(original: A)为每个子类编写代码并添加self.property = original.property看起来非常愚蠢的方法来解决它.

第二种方法显示了使用Mirror来迭代对象的所有属性,但是由于没有办法设置self的值,因为self.setValue(for key)swift类不可用.

现在我无法将类类型更改为NSObject以获得此优势,也无法将其转换为struct.

参考:

复制协议的想法来自:swift中对象数组的深层复制

镜像的想法来自:https: //www.pluralsight.com/guides/microsoft-net/property-copying-between-two-objects-using-reflection

迭代Swift中的对象类属性

有办法解决这个问题吗?建议会非常有帮助.