Я только что поиграл с этим на игровой площадке и придумал этот рабочий код:
let array: [String] = ["Ho", "Hi", "Hello", "Hola", "Bonjour"]
let pred: (String) -> String.Element?
if true {
pred = { $0.first }
} else {
pred = { $0.last }
}
var grouped = Dictionary(grouping: array, by: pred)
print(grouped)
Так что параметр by ожидает значение того же типа в массиве .Element. например, String.Element.
Вы также можете сделать:
let array: [String] = ["Ho", "Hi", "Hello", "Hola", "Bonjour"]
let pred: (String) -> String.Element? = { true ? $0.first : $0.last }
var grouped = Dictionary(grouping: array, by: pred)
print(grouped)
Примечание: указание очевидного, но я использую true вместо реального условия.