У меня есть массив шрифтов, каждый из которых имеет familyName и fontName.
Я хотел бы преобразовать их в массив кортежей в виде (familyName: String, fontNames: [String]).
Я чувствую, что должен быть простой функциональный способ сделать это, но я не могу решить это.Самое близкое, что у меня есть, это два вызова reduce
: сначала в словарь, а затем в массив.
let dictionary = fonts.reduce(into [String : [String]]() ) { result, font in
let array = result[font.fontFamily] ?? []
result[fontFamily] = array + [font.fontName]
}
let array = dictionary(into: [(String, [String])]() ) { result, element in
result.append( (element.key, element.value.sorted()) )
}.sorted { $0.0 < $1.0 }
Я также сортирую массив кортежей и массив fontNames в массиве.кортежей.
Есть ли способ избежать словарь-посредник?
Большое спасибо.
Обновление Я создал игровую площадку, чтобы показать sanjaykmwtРезультаты их предложений:
struct Font {
let family: String
let name: String
}
let fonts = [
Font(family: "ABC", name: "abc"),
Font(family: "ABC", name: "def"),
Font(family: "ABC", name: "ghi"),
Font(family: "XYZ", name: "xyz"),
Font(family: "XYZ", name: "uvw")
]
let sortedFamily = fonts.sorted(by: { (lhs, rhs) -> Bool in
return lhs.family < rhs.family
})
let dict = sortedFamily.map({["family":$0.family,
"fonts":$0.name]})
print("dict: \(dict)")
Вывод:
dict: [["family": "ABC", "fonts": "abc"], ["family": "ABC", "fonts": "def"], ["family": "ABC", "fonts": "ghi"], ["family": "XYZ", "fonts": "xyz"], ["family": "XYZ", "fonts": "uvw"]]