Анонимное закрытие не может быть использовано внутри замыкания с явными аргументами

Может ли smb объяснить, в чем проблема, как мне изменить код?

Мне нужно отфильтровать CKRecord, возвращенный из CloudKit.

override func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) {

    let defaultContainer = CKContainer.defaultContainer()
    let publicDatabase = defaultContainer.publicCloudDatabase

    let myfunc2 = myfunc(names, { (records: [CKRecord], error: NSError) in
        if error == nil {

            let records2 = records.filter($0.value > sourceIndexPath.row && $0.value < destinationIndexPath.row)

            let mro = CKModifyRecordsOperation(recordsToSave: [], recordIDsToDelete: [])

        } else {

        }
    })

enter image description here

Ответ 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, то есть заменить () на {})

Ответ 2

Я получил эту ошибку по совершенно другой причине.

Я возвращал замыкание вместо массива.

Я делал

return { cars.map {...}}

Удаление лишних фигурных скобок исправило это. Все, что я сделал, чтобы это исправить:

return  cars.map {...}