2014-12-11 10 views
8

Può SMB spiegare qual è il problema, come devo modificare il mio codice?chiusura Anonymous non può essere utilizzato all'interno di una chiusura che utilizza gli argomenti espliciti

ho bisogno di filtrare CKRecord s tornati dalla 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

risposta

18

Ci sono due modi per scrivere chiusure: con i nomi degli argomenti espliciti, o facendo riferimento agli argomenti da $ 0, $ 1, ecc

Ad esempio, queste due cose sono equivalenti:

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

Ma non si può mescolare queste cose - o si nominare gli argomenti, oppure utilizzare $n. Non si può fare entrambe le cose:

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

Nel tuo esempio, sembra che ti sei dimenticato di fornire una chiusura al metodo filter. Ciò significa che il tuo $0 non è all'interno di una nuova chiusura senza argomenti - in modo che il compilatore Swift pensa che il vostro $0 si riferisce alla chiusura esterna che i nomi si tratta di argomenti esplicitamente come records e error. Quindi si lamenta, non si può fare riferimento ad argomenti come $0 all'interno di una chiusura con nomi degli argomenti espliciti.

(la correzione è, naturalmente, per la fornitura in realtà una chiusura a filter cioè sostituire il () con {})