2015-04-20 6 views
5

ho qualche codice Objective-C che vorrei capire, al fine di fare lo stesso in rapida:Qual è l'equivalente di dispatch_block_t in swift?

dispatch_block_t adjustTooltipVisibility = ^{ 
    self.tooltipView.alpha = _tooltipVisible ? 1.0 : 0.0; 
    self.tooltipTipView.alpha = _tooltipVisible ? 1.0 : 0.0; 
}; 

Finora tutto quello che potevo scoprire su dispatch_block_t è che è utilizzato in dispatch_after in rapida come chiusura. Quindi posso capire che, ma non capisco l'uso di esso, proprio come questo in Objective-C e come trasformare questo codice in codice swift

risposta

6

dispatch_block_t è un alias di tipo per una chiusura Void -> Void. Swift (dalla versione 1.2) non ne deduce molto bene, quindi dovrai dichiarare il tipo. Dovrai inoltre fare riferimento in modo esplicito allo self per accedere alle proprietà dell'istanza e vorrai assicurarti di non creare un ciclo di riferimento. Dichiarare self come weak la chiusura è un approccio sicuro:

let adjustTooltipVisibility: dispatch_block_t = { [weak self] in 
    if self?._tooltipVisible == true { 
     self?.tooltipView.alpha = 1 
     self?.tooltipTipView.alpha = 1 
    } else { 
     self?.tooltipView.alpha = 0 
     self?.tooltipTipView.alpha = 0 
    } 
} 
+0

Che uso ha in questo caso? – Nico

+0

L'uso del sé debole è pessimo. Un riferimento debole può scomparire in qualsiasi momento, anche durante l'invio di un messaggio. È molto meglio fare un'iniziale se (lasciamo se stesso = self). – gnasher729

+0

Perché è usato questo 'dispatch_block_t'? Qual è la differenza se non la uso? – Nico

1
let adjustTooltipVisibility:Void->Void = { 
    self.tooltipView.alpha = _tooltipVisible ? 1.0 : 0.0 
    self.tooltipTipView.alpha = _tooltipVisible ? 1.0 : 0.0 
}; 

Se ci sarà qualcosa che porta a mantenere il ciclo, si dovrebbe usa la cattura sconosciuta a se stessi. Il tipo del blocco è Void-> Void

+1

Il^è un errore di copia-incolla, e il sé e l'inferenza di tipo deve essere aggiunto in effetti. Aggiornerò il risultato – user3349433

Problemi correlati