Swift: как уменьшить некоторые подэлементы в наборе с помощью однострочника?

#swift #reduce

Вопрос:

У меня есть эта модель:

 struct Class {
    var field: [String: Field]
}

struct Field {
    var type: String
}
 

И этот массив:

 let classes: [Class] = [
    Class(field: ["test": Field(type: "STRING"),
                  "test2": Field(type: "STRING"), 
                  "test3": Field(type: "NUMBER")]),
    Class(field: ["test": Field(type: "POINTER"),
                  "test2": Field(type: "STRING"), 
                  "test3": Field(type: "STRING")]),
]
 

Я хотел бы уменьшить все types свойства в наборе строк, я попробовал это:

 let result = classes.map { $0.field.reduce([], { $0   $1.value.type }) }
 

Но вместо того, чтобы получить набор строк:

Что я хотел бы получить

«СТРОКА», «ЧИСЛО», «УКАЗАТЕЛЬ»

Я получаю массив символов:

[[«S», «T», «R», «I», «N», «G», «N», «U», «M», «B»….]]

Что я должен написать вместо этого? Спасибо вам за вашу помощь

Комментарии:

1. Не могли бы вы, пожалуйста, указать ваши примерные входные данные и желаемый результат?

2. @jnpdx Спасибо за ваш ответ, я отредактировал свой вопрос.

Ответ №1:

Вы можете использовать flatMap для выравнивания массивов значений, а затем использовать Set для удаления неуникальных значений:

 let result = Set(classes.flatMap { $0.field.values }.map { $0.type })
 

Если вам нужно Array вместо a Set , вы можете просто завернуть вышесказанное в Array()