Создание единого массива из элементов во внутренних массивах

#arrays #swift

#массивы #swift

Вопрос:

Пожалуйста, рассмотрите следующее:

 struct House {
  let houseName: String
  let personIn: [Person]
}

struct Person {
  let name: String
  let age: Int
}

var persons: [Person] = [ Person(name: "pers1", age: 10),
                          Person(name: "pers2", age: 20),
                          Person(name: "pers3", age: 30)]

var houses: [House] = [House(houseName: "houseNameFirst", personIn: persons),
                       House(houseName: "houseNameSecond", personIn: persons),
                       House(houseName: "houseNameThird", personIn: persons)]

let names = houses.map{ $0.personIn.map{$0.name}}
print(names) // Prints  [["pers1", "pers2", "pers3"], ["pers1", "pers2", "pers3"], ["pers1", "pers2", "pers3"]]
  

Мне нужен массив только имен пользователей, а не массив массивов, есть ли короткий способ добиться этого, не создавая расширения для массива?

Ответ №1:

Swift 5.2 или более поздней версии вы можете использовать keypath для выравнивания своей коллекции, а затем просто сопоставить имя

 let names = houses.flatMap(.personIn).map(.name)
  

Ответ №2:

Просто используйте flatMap(_:) функцию для houses массива:

 let names = houses.flatMap { $0.personIn.map{ $0.name } }