Dictionary(grouping: , by: ) - 作为变量传递的谓词闭包

Dictionary(grouping: , by: ) - predicate closure passed as a variable

我有兴趣使用 Dictionary(grouping: , by: ) initializer。 但是,我必须根据情况根据不同的键对项目进行分组。我如何有条件地 select 密钥,然后将其作为变量传递给 by: 参数?

let predicate: ((MyObjectType) -> Int?)
if shouldUseValue1 {
    predicate = {[=10=].value1?.intValue}
} else {
    predicate = {[=10=].value2?.intValue}
}

var grouped = Dictionary(grouping: arrayToGroup, by: predicate)

我得到的错误是:

Cannot convert value of type '(MyObjectType) -> Int?' to expected argument type '(_) -> _'

所以,问题是我应该将什么类型传递给初始化程序的 by: 参数才能使其工作?

我刚刚在 Playground 上玩这个,想出了这个工作代码:

let array: [String] = ["Ho", "Hi", "Hello", "Hola", "Bonjour"]
let pred: (String) -> String.Element?

if true {
    pred = { [=10=].first }
} else {
    pred = { [=10=].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 ? [=11=].first : [=11=].last }

var grouped = Dictionary(grouping: array, by: pred)
print(grouped)

注意:陈述显而易见,但我使用的是 true 而不是真实条件。