правильное решение казалось бы чтобы создать структуру (или класс) Pet
и собрать всю эту информацию в структуру и построить либо массив, либо словарь, полный этих значений.
struct Pet {
let name: String
let type: String
let color: String
init(name: String, type: String, color: String) {
self.name = name
self.type = type
self.color = color
}
}
Теперь давайте создадим массив из этих животных:
var goodPets = [Pet]()
for (petName, petType) in pets {
guard let petColor = petcolor[petName] else {
// Found this pet's type, but couldn't find its color. Can't add it.
continue
}
goodPets.append(Pet(name: petName, type: petType, color: petColor))
}
Теперь, когда мы заполнили goodPets
, вытаскивая какое-либо конкретное подмножество домашних животных становится очень легко:
let redDogs = goodPets.filter { $0.type == "dog" && $0.color = "red" }
И хотя этот ответ похож на множество заданий & по сравнению с другими ответами, главное преимущество вот как только мы построим массив goodPets
, любой способ, которым мы хотим выкопать домашних животных, в конечном итоге становится более эффективным. И поскольку мы увеличиваем количество свойств, которые есть у домашних животных, это становится все более и более истинным по сравнению с другими ответами.
Если вы предпочитаете хранить свои объекты модели в словаре продолжает использовать имена в качестве ключей, мы можем сделать это так же хорошо, но фильтр выглядит немного незнакомца.
Построение словаря выглядит в основном тот же:
var goodPets = [String : Pet]()
for (petName, petType) in pets {
guard let petColor = petcolor[petName] else {
// Found this pet's type, but couldn't find its color. Can't add it.
continue
}
goodPets[petName] = (Pet(name: petName, type: petType, color: petColor))
}
Но фильтр немного отличается:
let redDogs = goodPets.filter { $0.1.type = "dog" && $0.1.color = "red" }
Обратите внимание, что в обоих случаях redDogs
имеет тип [Pet]
, то есть, массив значений Pet
.
Возможно, лучше использовать объекты, чем словари. – brimstone