2014-10-30 10 views
14

con chiusure di solito accodare [sé debole] sulla mia lista di cattura e poi fare un controllo nullo sull'auto:è auto catturato all'interno di una funzione annidata

func myInstanceMethod() 
{ 
    let myClosure = 
    { 
     [weak self] (result : Bool) in 
     if let this = self 
     { 
      this.anotherInstanceMethod() 
     } 
    } 

    functionExpectingClosure(myClosure) 
} 

Come si esegue il controllo di nulla su di sé se io 'm utilizzando una funzione annidata in luogo di una chiusura (o è l'assegno addirittura necessario ... o è addirittura buona norma utilizzare una funzione annidata come questo) cioè

func myInstanceMethod() 
{ 
    func nestedFunction(result : Bool) 
    { 
     anotherInstanceMethod() 
    } 

    functionExpectingClosure(nestedFunction) 
} 

risposta

19

Purtroppo, solo chiusure hanno "Capture Elenco "funzionalità come [weak self]. Per le funzioni annidate, è necessario utilizzare le normali variabili weak o unowned.

func myInstanceMethod() { 
    weak var _self = self 
    func nestedFunction(result : Bool) { 
     _self?.anotherInstanceMethod() 
    } 

    functionExpectingClosure(nestedFunction) 
} 
+3

È presente nella documentazione ufficiale per caso? –

+0

Sembra che questo sia vero. Ho fatto un test e il debole della chiusura non è passato al sé nella funzione annidata. Così tanto per il codice pulito. – possen

Problemi correlati