У меня есть такая структура в коде, которая является идентифицируемой и имеет вложенные элементы:
struct Item: Identifiable {
let id: UUID = UUID()
var nameOfItem: String
var nestedItems: [Item]
init(nameOfItem: String, nestedItems: [Item]) {
self.nameOfItem = nameOfItem
self.nestedItems = nestedItems
}
}
var myArray: [Item] = [Item]()
Моя проблема заключается в том, что после создания массива, если мне нужно обновить элемент, я знаю идентификатор этого элемента, но не знаю, как найти этот идентификатор и найти его правильно. посмотрите на эту фотографию, я могу просмотреть каждый элемент myArray, чтобы найти элемент, соответствующий моему идентификатору поиска, и если в элементах myArray нет элемента, который я ищу, мне придется начать искать внутри вложенных элементов каждого элемента массива, что заняло бы массу времени. Хотите узнать, есть ли более быстрый способ найти нужный предмет.
Для ... update an item I know the id of that Item but I do not know how to look for that id and find it in correct way
используйте рекурсию, например:
func findItem(withID id: UUID, in items: [Item]) -> Item? {
for item in items {
if item.id == id {
return item
}
if let foundItem = findItem(withID: id, in: item.nestedItems) {
return foundItem
}
}
return nil
}
РЕДАКТИРОВАТЬ-1:
Вы можете использовать тот же подход (рекурсию) для создания словаря [UUID: Item]
один раз.
После этого вы можете напрямую получить доступ/обновить желаемый идентификатор элемента, без каких-либо дополнительных затрат на доступ.
var itemDictionary = createItemDictionary(items: myArray)
itemDictionary[item2.id]?.nameOfItem = "Mickey Mouse" // <--- here
func createItemDictionary(items: [Item]) -> [UUID: Item] {
var itemDictionary: [UUID: Item] = [:]
for item in items {
itemDictionary[item.id] = item
itemDictionary.merge(createItemDictionary(items: item.nestedItems)) { (_, new) in new }
}
return itemDictionary
}