Dictionary (grouping:, by:) - закрытие предиката, переданное как переменная - PullRequest
0 голосов
/ 07 ноября 2019

Я заинтересован в использовании Dictionary(grouping: , by: ) инициализатора . Тем не менее, я должен сгруппировать элементы на основе разных ключей, в зависимости от обстоятельств. Как я могу условно выбрать ключ и затем передать его в качестве переменной аргументу by:?

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

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

Я получаю ошибку:

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

Итак,Вопрос в том, какой тип я должен передать аргумент by: инициализатора, чтобы он работал?

1 Ответ

1 голос
/ 07 ноября 2019

Я только что поиграл с этим на игровой площадке и придумал этот рабочий код:

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 вместо реального условия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...