如何定义泛型类型(如KeyPath)的类型参数包正确语法?
Swift 批量更新对象属性的正确参数包语法实现
问题分析
你原代码的语法错误在于参数包的定义方式不符合Swift规范,无法直接用repeat包装带标签的元组作为参数。要实现批量更新属性的功能,需要基于Swift 5.9+引入的参数包(each/repeat)特性调整写法。
正确实现代码
final class A { var field1: Int var field2: String var field3: Bool init(field1: Int, field2: String, field3: Bool) { self.field1 = field1 self.field2 = field2 self.field3 = field3 } // 基于参数包的批量更新方法 func update<each T>(_ updates: repeat (WritableKeyPath<A, each T>, each T)) { repeat { let (keyPath, newValue) = each updates self[keyPath: keyPath] = newValue } } }
使用示例
// 初始化对象 let instance = A(field1: 1, field2: "original", field3: true) // 批量更新多个属性 instance.update((\.field2, "new-2"), (\.field1, 14)) print(instance.field1) // 输出: 14 print(instance.field2) // 输出: new-2 // 更新单个属性 instance.update((\.field3, false)) print(instance.field3) // 输出: false
关键说明
- 函数定义中,
repeat (WritableKeyPath<A, each T>, each T)表示接收任意数量的元组参数,每个元组包含一个对应属性的WritableKeyPath和匹配类型的新值。 - 函数内部通过
repeat块遍历参数包中的每个元组,解构出键路径和新值后完成赋值操作。 - 该实现要求使用Swift 5.9及以上版本,因为参数包是Swift 5.9新增的语言特性。
可选写法(分离键路径与值参数包)
如果偏好分开传递键路径和值的写法,也可以这样实现:
extension A { func update<each T>(keyPaths: repeat WritableKeyPath<A, each T>, values: repeat each T) { repeat { self[keyPath: each keyPaths] = each values } } } // 调用方式 instance.update(keyPaths: \.field1, \.field3, values: 20, true)
内容的提问来源于stack exchange,提问作者sugar baron
相关产品推荐
相关产品推荐

