Поиск и изменение структуры в составе массива

Помогите, найти лучший вариант реализации. Дано: Массив со структурами. Необходимо внести изменения в конкретную структуру.

Реализация очень топорная, уверен, что есть то чего я не знаю и намного элегантней вариант

import Foundation

struct Person {
    var id: Int
    var name: String
}

var contacts: [Person] = [
    Person(id: 1, name: "Alex"),
    Person(id: 2, name: "Stiv"),
    Person(id: 3, name: "Joy")
]


func renamePerson(id: Int, name: String, array: [Person]) -> [Person] {

    var result: [Person] = []

    for i in array {
        if i.id == id {
            result.append(Person(id: i.id, name: name))
        } else {
            result.append(i)
        }
    }
    return result
}

contacts = renamePerson(id: 1, name: "Sasha", array: contacts)

Ответы (2 шт):

Автор решения: schmidt9

Можно изменить тип Person на class, чтобы можно было изменять объекты массива, и переписать код так. Если же тип struct нужно сохранить, то ваш вариант в данном случае по-моему единственно возможный

class Person {
    var id: Int
    var name: String

    init(id: Int, name: String) {
        self.id = id
        self.name = name
    }
}

func renamePerson(id: Int, name: String, array: [Person]) {

    // вариант 1
    for i in array {
        if i.id == id {
            i.name = name
            break
        }
    }

    // вариант 2
    array.first { $0.id == id }?.name = name
}

renamePerson(id: 1, name: "Sasha", array: contacts)

Дополнение

Можно сохранить тип struct, если сделать массив inout. Тогда возможен такой вариант

func renamePerson2(id: Int, name: String, array: inout [Person]) {
    for i in 0..<array.count {
        if array[i].id == id {
            array[i] = Person(id: array[i].id, name: name)
            break
        }
    }
}

renamePerson2(id: 1, name: "Sasha", array: &contacts)
→ Ссылка
Автор решения: Roman Podymov

В Swift 5/Xcode 11.5 для решения Вашей задачи можно воспользоваться функцией map:

func renamePerson(id: Int, name: String, array: [Person]) -> [Person] {
    return array.map { $0.id == id ? Person(id: id, name: name) : $0 }
}
→ Ссылка