Вы используете массив фруктов:
let listOfFruits = [
Fruit(name: "Apple", taste: "Sweet"),
Fruit(name: "Orange", taste: "Tart"),
Fruit(name: "Cherries", taste: "Juicy"),
Fruit(name: "Banana", taste: "Sweet"),
Fruit(name: "Carambola", taste: "Tart"),
Fruit(name: "Pear", taste: "Sweet"),
]
Но это неэффективная структура, потому что каждый раз, когда вы хотите найти фрукты в этом массиве, вы должны просматривать их.
Вместо этого вы можете использовать словарь.
Например, вы можете создать его из listOfFruits
:
let fruitDictionary = Dictionary(grouping: listOfFruits) { $0.name }
Или, если этот listOfFruits
только для поискаВначале вы можете просто определить его как словарь и пропустить этот шаг «преобразования массива в словарь».
Независимо от того, что дан массив имен канадских фруктов:
let listOfFruitNamesInCanada = ["Cherries", "Pear", "Cherries", "Apple"]
Если выЕсли вам нужен соответствующий массив Fruit
объектов, теперь вы можете искать в словаре Fruit
экземпляров:
let listOfFruitsInCanada = listOfFruitNamesInCanada.compactMap { fruitDictionary[$0] }
В результате:
[
[Fruit(name: "Cherries", taste: "Juicy")],
[Fruit(name: "Pear", taste: "Sweet")],
[Fruit(name: "Cherries", taste: "Juicy")],
[Fruit(name: "Apple", taste: "Sweet")]
]
Ключ на выносзаключается в том, что я не сканирую массив с помощью listOfFruits.first(where: ...)
(потому что он должен повторно сканировать массив для каждого фрукта, который мы ищем, с итоговой сложностью O(n)
).Вместо этого я использую словарь fruitDictionary[...]
(в котором мы можем сразу найти нужный объект Fruit
со сложностью O(1)
).
Не связано, но вы можете рассмотреть возможность использования struct
типов:
struct Fruit {
let name: String
let taste: String
}
struct Country {
let name: String
let listOfFruit: [String]
}
Вы можете использовать свои class
ссылочные типы, если вы действительно этого хотите, но в настоящее время мы склонны использовать struct
типов значений.