将一组参数从一个对象复制到另一个对象的最佳方法

问题描述 投票:0回答:1

作为例子,我有结构/类:

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)

如果不可能,从一个对象复制到另一大参数集的最佳方法是什么?

swift swift-keypath
1个回答
0
投票

这可以通过参数包来实现。

首先我们编写一个仅复制一个关键路径的方法:

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))
© www.soinside.com 2019 - 2024. All rights reserved.