Непонятно, нужен ли вам индекс страны, содержащей город, в этом случае это будет работать
func index(of city: String, in countries: [Country]) -> Int? {
countries.firstIndex{$0.cities.contains{$0.name == city}}
}
, а затем использовать его
let indexOfCountryWithCity = index(of: "Chicago", in: countries)
или если вывам нужен индекс города в массиве городов страны, в этом случае вам нужно будет добавить второй шаг
func index(of city: String, in countries: [Country]) -> (countryIndex: Int?, cityIndex: Int?) {
guard let countryIndex = countries.firstIndex(where: {$0.cities.contains{$0.name == city}})
else {return (nil, nil)}
let cityIndex = countries[countryIndex].cities.firstIndex{$0.name == city}
return (countryIndex, cityIndex)
}
, и теперь метод вернет кортеж с индексом country
вмассив countries
и индекс city
в массиве cities
этой страны.
Использование:
if let result = index(of: "Chicago", in: countries), let countryIndex = result.countryIndex, let cityIndex result.cityIndex {
//do something with countryIndex & cityIndex
}
Обратите внимание, что возвращаемое значение будет необязательным для работы сгород не существует, и поэтому необходимо развернуть его выше.
ОБНОВЛЕНИЕ в связи с уточнением Вопроса. Необходимо получить cityIndex & countryIndex, указав названия стран и городов
func indexOf(city: String, inCountry country: String, in countries: [Country]) -> (countryIndex: Int, cityIndex: Int)? {
guard let countryIndex = countries.firstIndex(where: {$0.name == country}), let cityIndex = countries[countryIndex].cities.firstIndex(where: {$0.name == city}) else {return nil}
return (countryIndex, cityIndex)
}
. Обратите внимание, что кортеж теперь является необязательным, а не полями, поэтому его проще развернуть:
if let indexes = indexOf(city: "Bristol", inCountry: "UK", in: countries) {
//do something with indexes.countryIndex and indexes.cityIndex
}