可以解释问题是什么,我应该如何修改我的代码?
我需要过滤从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 {
}
})
答案 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 {...}