Swift 有没有办法使这个函数通用?

Swift 有没有办法使这个函数通用?,swift,generics,Swift,Generics,我有一个数据集: struct MyData { var name: String var date: Date var quantity: Int var inStock: Bool } 然后在数组中使用 let myArray: [MyData] = [...] 我现在正在写改变值的方法 func changeName(to newName: String) { myArray[0].name = newName } func changeDate(to newDat

我有一个数据集:

struct MyData {
  var name: String
  var date: Date
  var quantity: Int
  var inStock: Bool
} 
然后在数组中使用

let myArray: [MyData] = [...]
我现在正在写改变值的方法

func changeName(to newName: String) { myArray[0].name = newName }

func changeDate(to newDate: Date) { myArray[0].date = newDate }

func changeQuantity(to newQuantity: Int) { myArray[0].quantity = newQuantity}
我开始认为这是泛型的一个完美例子,比如

func changeValue<Value>(to newValue: Value) { ... }

关于这件事的任何指导都会很有帮助

如果您
var
声明您的属性,您可以将以下函数添加到结构中

mutating func setValue<Value>(_ value: Value, for keyPath: WritableKeyPath<Self, Value>) {
    self[keyPath: keyPath] = value
}
这将更新对象

MyData(名称:“abs”,日期:2021-03-27 18:26:26+0000,数量:500,库存:真)


那么,我不太清楚如何将其用于阵列,但您至少有一个工具可以使用。

我没有时间写答案,但要查找“关键路径”。为什么您需要这个?类似于
myArray.change(值:\.name,改为:“new name”)
over
myArray[0]。name=“new name”
?如果有两个相同类型的属性怎么办?@SergioBost我看不到编写方法来更改元素属性有任何好处。顺便说一句,您需要首先将它们声明为变量而不是常量。如果你真的想使用密钥路径,你所需要的就是
myArray[0][keyPath:\.name]=“whatever”
,但在我看来,按照Martin R的建议做起来更容易
myArray[0]。name=“whatever”
@SergioBost这是显而易见的。我的意思是不经过钥匙道是的!如果我能不止一次投票给你,我会的。这正是我想要的。旁注:我不明白为什么人们会投票否决一个问题,这是一件很糟糕的事情,为什么会让提问者感到羞耻。。无论如何,谢谢@SergioBost为什么不干脆
myData.quantity=500
?除此之外,我不明白这个方法的目的didactic@LeoDabus如果我只有一个属性需要更新,那么我同意它是没有意义的,但是我的问题的全部目的是避免编写函数来更新每个属性。有了上面的代码,我可以用一种方法来实现。我认为你的方法也可以,但效果类似,代码行更少对不起,你不需要一个方法。您可以简单地将下标与属性一起使用,通常一次可能需要更新多个属性
mutating func setValue<Value>(_ value: Value, for keyPath: WritableKeyPath<Self, Value>) {
    self[keyPath: keyPath] = value
}
var myData = MyData(name: "abs", date: Date(timeIntervalSince1970: 0), quantity: 0, inStock: false)

myData.setValue(500, for: \.quantity )
myData.setValue(Date(), for: \.date)
myData.setValue(true, for: \.inStock)