2014-12-11 16 views
8

Sorun nedir açıklayabilir miyim, kodumu nasıl değiştirmeliyim?Anonim kapatma, açık argümanları olan bir kapağın içinde kullanılamaz

CloudKit'dan dönen CKRecord s filtrelemem gerekiyor.

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

cevap

18

kapanışları yazmak için iki yol vardır: açık argüman adlarıyla veya vb $ 0 $ 1 olarak argümanlar atıfta bulunarak

Örneğin, bu iki şey eşdeğerdir:

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

Ama bunları karıştırmak olamaz - ya argümanları isim veya $n kullanın. Her iki yapamaz: Eğer filter yöntemine bir kapatma sağlamak için unuttuysanız gibi örnekte

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

görünüyor. Bu, $0 ürününüzün argümanlar olmadan yeni bir kapanışın içinde olmadığı anlamına gelir; bu nedenle Swift derleyici, $0 ürününüzün, records ve error gibi açıkça argümanları olarak adlandırdığı dış kapamaya başvurduğunu düşünür. Bu nedenle, argümanlara açık argüman adlarıyla bir kapanış içinde $0 olarak başvuramadığınızdan şikayetçi oluyor.

(düzeltme aslında senin () {} ile değiştirin yani filter için bir kapatma sağlamak için elbette)

İlgili konular