Быстрое замыкающее замыкание не может быть скомпилировано - PullRequest
0 голосов
/ 24 февраля 2019

Я пытался превратить последовательность пар ключ-значение (кортежи) в словарь:

let pairs = [("a", 1), ("b", 2), ("a", 3), ("b", 4)]

let firstValues = Dictionary( pairs,
    uniquingKeysWith: { (first, _) in first }
)
// ["b": 2, "a": 1]

, но когда я пытаюсь использовать синтаксис замыкающего замыкания, код просто не может скомпилироваться, почему?

// ⛔️ error: contextual closure type '(_, _) -> _' 
//    expects 2 arguments, but 1 was used in closure body
let firstValues2 = Dictionary( pairs ) { $0 }

1 Ответ

0 голосов
/ 24 февраля 2019

Ничего общего с синтаксисом замыкающего замыкания не имеет.

Если вы попробуете приведенный ниже код, он также будет жаловаться:

let firstValues = Dictionary(pairs, uniquingKeysWith: { $0 })

Компилятор жалуется, что вы не используете новое значение.У вас есть несколько способов обойти.

1) дать значениям имя:

let firstValues1 = Dictionary(pairs) { oldValue, newValue in oldValue }

2) вы также можете игнорировать значение, используя подчеркивание

let firstValues2 = Dictionary(pairs) { oldValue, _ in oldValue }

3) использовать любой тип использования старого значения, а также нового значения.Компилятору достаточно простой печати. ​​

let firstValues3 = Dictionary(pairs) {
    print($1)
    return $0
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...