Поиск и изменение структуры в составе массива
Помогите, найти лучший вариант реализации. Дано: Массив со структурами. Необходимо внести изменения в конкретную структуру.
Реализация очень топорная, уверен, что есть то чего я не знаю и намного элегантней вариант
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 }
}