2015-12-16 23 views
7

Qual è la differenza tra passare [weak self] come argomento a una chiusura vs passa [weak self]()Differenza tra sé debole vs sé debole()

Ad esempio:

dispatch_async(dispatch_get_main_queue()) { [weak self] in 
    //Some code here 
} 

v/s

dispatch_async(dispatch_get_main_queue()) { [weak self]() -> Void in 
    //Some code here 
} 
+0

@MartinR codice aggiornato. In realtà in alcune implementazioni vedo [il sé debole] che viene usato senza parentesi tonde e in alcuni vedo che viene usato come [auto debole](). Qual è esattamente la differenza tra questi due? –

risposta

9

Non si passa [weak self]() come argomento per una chiusura.

  • [weak self] è una lista cattura e precede il
  • lista dei parametri/tipo di ritorno dichiarazione () -> Void

nell'espressione di chiusura.

Il tipo di ritorno o entrambi nell'elenco parametri e ritorno tipo può essere omesso se possono essere dedotte dal contesto, quindi tutti questi sono valide e tutto equivalente:

dispatch_async(dispatch_get_main_queue()) { [weak self]() -> Void in 
    self?.doSomething() 
} 

dispatch_async(dispatch_get_main_queue()) { [weak self]() in 
    self?.doSomething() 
} 

dispatch_async(dispatch_get_main_queue()) { [weak self] in 
    self?.doSomething() 
} 

La chiusura prende un parametro vuoto lista () e ha un tipo di ritorno Void .

+0

() = Vuoto. In realtà dovresti preferire Void anziché() per chiarezza, quindi questo dovrebbe essere Void -> Void – Yariv

+0

@ yar1vn: Potrebbe essere una questione di gusti personali. Preferisco '()' per un elenco di parametri vuoto/vuoto e 'Void' come tipo di ritorno. Questo è anche ciò che Apple fa nella definizione 'dispatch_block_t'. –

+0

1. dispatch_block_t non è una funzione Swift. 2. La community Swift sta creando lo standard e preferisce Void. 3. Ma hai ragione, dal momento che entrambi funzionano puoi scegliere quello che preferisci. – Yariv