我正在尝试深度复制Swift类实例.由于copy和mutableCopy函数仅适用于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
有办法解决这个问题吗?建议会非常有帮助.
| 归档时间: |
|
| 查看次数: |
788 次 |
| 最近记录: |