You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定义泛型类型(如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 22:13:15