匿名闭包不能在具有显式参数的闭包内使用

时间:2014-12-11 22:41:36

标签: ios swift closures

可以解释问题是什么,我应该如何修改我的代码?

我需要过滤从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

2 个答案:

答案 0 :(得分:21)

有两种方法可以编写闭包:使用显式参数名称,或者将参数引用为$ 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和{{1 }}。所以它抱怨你不能在具有显式参数名称的闭包内引用参数error

(修正当然是为$0实际提供一个闭包,即用filter替换()

答案 1 :(得分:0)

我收到此错误的原因完全不同。

我返回的是闭包而不是数组。

我在做

return { cars.map {...}}

除去多余的花括号即可将其固定。我所做的所有修复工作都是:

return  cars.map {...}