gpt4 book ai didi

swift - 从一个更大的结构更新一些嵌套结构的清晰方法

转载 作者:行者123 更新时间:2023-11-28 10:33:02 25 4
gpt4 key购买 nike

假设我们有一些具有多个嵌套级别的复杂结构(为简单起见,在示例中只有一个级别,但可以有更多)。

例子。我们有一个数据结构:

struct Company {
var employee: [Int: Employee]
}

struct Employee {
var name: String
var age: Int
}

var company = Company(employee: [
1: Employee(name: "Makr", age: 25),
2: Employee(name: "Lysa", age: 30),
3: Employee(name: "John", age: 28)
])

现在我们要创建一个函数来更新公司的一些员工。我们可以使用 inout 参数来编写它:

func setAge(_ age: Int, forEmployee employee: inout Employee) {
employee.age = age
}

setAge(26, forEmployee: &company.employees[1]!)

这可行,但如您所见,我们需要在通过 ref 传递表达式“company.employees[1]”之前解包它。如果提供的 key 没有这样的员工,这种强制解包会产生运行时错误。

所以我们需要检查员工是否存在:

if company.employees[1] != nil {
setAge(26, forEmployee: &company.employees[1]!)
}

这也行,但是这段代码有点难看,因为我们需要将表达式 'company.employees[1]' 重复两次。

所以问题是:有没有办法摆脱这种重复?

我尝试在修改函数中使用可选的 inout 参数,但无法使其正常工作。

最佳答案

根据你的评论,喜欢

What I wanted in the first place is just to have a reference to a substructure of a bigger structure so the part of code that is dealing with the substructure could know nothing about where is this substructure located in the bigger structure.

It would be ideal if I just could create a local inout var. Like if var employ: inout Employee? = company.employee[1] { // make whatever I want with that employee }.

我认为你想要的是一个通用的更新函数。在社区中,这是实用函数系列的一部分,称为 with ( https://forums.swift.org/t/circling-back-to-with/2766 )

在这种情况下,您需要的版本基本上是 guardnil 上,所以我建议类似

func performUpdateIfSome <T> (_ value: inout T?, update: (inout T) throws -> Void) rethrows {
guard var _value = value else { return }
try update(&_value)
value = _value
}

有了这个实用程序,你想做的事就可以用

performUpdateIfSome(&company.employees[1], update: { $0.age = 26 })

注意事项

如果您想抽象出如何访问员工而不是公司,那么键路径也是一个选项:)

关于swift - 从一个更大的结构更新一些嵌套结构的清晰方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55140050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com