作为例子,我有结构/类:
struct Pet {
var id: String
var name: String
var age: Int
var type: PetType
}
enum PetType: Int {
case cat
case dog
}
是否可以编写扩展来将一组参数从一个对象复制到另一个对象?
喜欢:
var pet1 = Pet(id: "MyCat1", name: "Cookie", age: 4, type: .cat)
let pet2 = Pet(id: "randomCatId", name: "Socks", age: 3, type: .dog)
pet1.copy(from: pet2, valuesOfKeys: [\.name, \.age] )
// after this pet1 will be:
// ("MyCat1", "Socks", 3, .cat)
// instead of
// ("MyCat1", "Cookie", 4, .cat)
如果不可能,从一个对象复制到另一大参数集的最佳方法是什么?
这可以通过参数包来实现。
首先我们编写一个仅复制一个关键路径的方法:
func copy<T, Value>(from src: T, to dest: inout T, keyPath: WritableKeyPath<T, Value>) {
dest[keyPath: keyPath] = src[keyPath: keyPath]
}
然后,我们可以编写一个接受关键路径元组的方法,所有这些都可以是不同类型值的关键路径,并重复调用上述方法。
func copy<T, each Value>(from src: T, to dest: inout T, keyPaths: (repeat WritableKeyPath<T, each Value>)) {
repeat copy(from: src, to: &dest, keyPath: each keyPaths)
}
这意味着在调用该方法时应该使用元组而不是数组文字:
copy(from: pet2, to: &pet1, keyPaths: (\.name, \.age))