2015-12-16 15 views
7

co stanowi różnicę między przechodzącą [weak self] jako argumentu do zamykania vs przechodzącej [weak self]()Różnica słabego siebie vs słabego siebie()

Na przykład:

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 zaktualizowany kod. Właściwie w niektórych implementacjach widzę [słabe ja] używane bez nawiasów okrągłych, a w niektórych widzę, że jest używane jako [słabe ja](). Czym dokładnie jest różnica między tymi dwoma? –

Odpowiedz

9

Nie przekazuj [weak self]() jako argumentu do zamknięcia.

  • [weak self] jest lista przechwytywania i poprzedza
  • lista parametrów/Zwraca typ deklaracja () -> Void

w wyrażeniu zamknięcia.

Typ zwracany lub oba lista parametrów i powrócić typu może zostać pominięty, jeśli mogą one wywnioskować z kontekstu, więc wszystkie one są ważne iw pełni równoważne:

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() 
} 

Zamknięcie odbywa pusty parametr lista () i ma typ zwrotu: Void .

+0

() = Void. Powinieneś raczej preferować Void zamiast() dla jasności, dlatego powinno to być Void -> Void – Yariv

+0

@ yar1vn: To może być kwestia osobistego gustu. Wolę '()' dla pustej/pustej listy parametrów, a 'Void' jako typ zwracany. To samo robi Apple w definicji "dispatch_block_t". –

+0

1. dispatch_block_t nie jest funkcją Swift. 2. Społeczność Swift tworzy standard i woli Void. 3. Ale masz rację, ponieważ oba działają, możesz wybrać, który z nich wolisz. – Yariv

Powiązane problemy