Ответ 1
Существует два способа записи замыканий: с явными именами аргументов или путем ссылки на аргументы как $0, $1 и т.д.
Например, эти две вещи эквивалентны:
// implicit argument names, $0 and $1
let x = reduce(1...5, 0) { $0 + $1 }
// explicit argument names i and j
let y = reduce(1...5, 0) { i, j in i + j }
Но вы не можете смешивать эти вещи - либо вы называете аргументы, либо используете $n
. Вы не можете сделать оба:
// name the arguments, but still use $0 and $1
let x = reduce(1...5, 0) { $0 + $1 }
// compiler error: Anonymous closure arguments cannot be used
// inside a closure that has explicit arguments
В вашем примере, похоже, вы забыли предоставить закрытие методу filter
. Это означает, что ваш $0
не входит в новое замыкание без аргументов, поэтому компилятор Swift считает, что ваш $0
ссылается на внешнее закрытие, которое явно определяет его аргументы как records
и error
. Таким образом, жалобы вы не можете ссылаться на аргументы как $0
внутри замыкания с явными именами аргументов.
(исправление, конечно, действительно должно содержать замыкание на filter
, то есть заменить ()
на {}
)