2014-12-11 11 views
8

Kann smb erklären, was das Problem ist, wie soll ich meinen Code ändern?Anonyme Schließung kann nicht innerhalb einer Schließung verwendet werden, die explizite Argumente hat

Ich muss Filter CKRecord s zurückgegeben von 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

Antwort

18

Es gibt zwei Möglichkeiten Verschlüsse zu schreiben: mit expliziten Argumentnamen oder durch als $ 0, $ auf die Argumente Bezug auf 1 usw.

Zum Beispiel diese beiden Dinge sind äquivalent:

// 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 } 

Aber man kann diese Dinge nicht vermischen - entweder Sie die Argumente nennen, oder Sie verwenden $n. Sie können nicht beides tun:

// 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 

In Ihrem Beispiel sieht es aus wie Sie vergessen haben, einen Verschluss der filter Verfahren zu liefern. Das bedeutet, dass $0 nicht in einem neuen Abschluss ohne Argumente enthalten ist - also denkt der Swift-Compiler, dass Ihr $0 auf den äußeren Abschluss verweist, der seine Argumente explizit als records und error bezeichnet. Es beschwert sich also, dass Sie innerhalb eines Abschlusses mit expliziten Argumentnamen nicht auf Argumente wie $0 verweisen können.

(das Update ist natürlich eigentlich eine Schließung zu filter liefern das heißt Ihre () mit {} ersetzen)

Verwandte Themen