2015-12-16 1 views
7

Quelle est la différence entre le passage [weak self] comme un argument pour une fermeture vs passage [weak self]()Différence entre faible auto vs auto faible()

Par exemple:

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 code mis à jour. En fait, dans certaines implémentations, je vois [self faible] être utilisé sans parenthèses et dans certains je le vois comme [self self](). Quelle est exactement la différence entre ces deux? –

Répondre

9

Vous ne transmettez pas [weak self]() comme argument à une fermeture.

  • [weak self] est une liste de capture et précède le
  • liste des paramètres/type de retour déclaration () -> Void

dans l'expression de fermeture.

Le type de retour ou à la fois la liste des paramètres et le type de retour peut être omis si elles peuvent être déduites du contexte, de sorte que tous ceux-ci sont valables et entièrement équivalentes:

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 fermeture prend un paramètre vide liste () et a un type de retour Void .

+0

() = Annulé. Vous devriez préférer Void au lieu de() pour plus de clarté, donc cela devrait être vide -> Void – Yariv

+0

@ yar1vn: Cela peut être une question de goût personnel. Je préfère '()' pour une liste de paramètres vide/void, et 'Void' comme type de retour. C'est aussi ce que fait Apple dans la définition 'dispatch_block_t'. –

+0

1. dispatch_block_t n'est pas une fonction Swift. 2. La communauté Swift crée la norme et préfère le vide. 3. Mais vous avez raison, puisque les deux fonctionnent, vous pouvez choisir celui que vous préférez. – Yariv