Скажем, у нас есть некоторая сложная структура с несколькими вложенными уровнями (для простоты в примере будет только один уровень, но может быть и больше).
Пример.У нас есть структура данных:
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
param:
func setAge(_ age: Int, forEmployee employee: inout Employee) {
employee.age = age
}
setAge(26, forEmployee: &company.employees[1]!)
. Это работает, но, как вы можете видеть, нам нужно развернуть выражение 'company.employees [1]', прежде чем передать его в ref.Это принудительное развертывание может привести к ошибке времени выполнения, если для указанного ключа такого сотрудника нет.
Поэтому нам нужно проверить, существует ли сотрудник:
if company.employees[1] != nil {
setAge(26, forEmployee: &company.employees[1]!)
}
Это также работает, но этот кодотчасти уродливо, потому что нам нужно повторить выражение «company.employees [1]» два раза.
Итак, вопрос: есть ли какой-нибудь способ избавиться от этого повторения?
Я попытался использовать необязательный параметр inout в функции изменения, но не смог заставить его работать.