wykonujemy wiele asynchronicznych prac na urządzeniach mobilnych, aby nasz kod nie blokował głównego wątku. Wcześniej oznaczało to wiele metod delegowania, ale nowsze postępy w Objective-C pozwoliły nam zwracać wartości do bloków jako elementy obsługi uzupełniania. Bez wątpienia będziemy musieli zrobić wiele z tego również w swift.
oto definicja funkcji z Objective-C, która wykorzystuje wzorzec bloku dopełnienia i powiązaną składnię, aby go użyć:
- (void)hardProcessingWithString:(NSString *)input withCompletion:(void (^)(NSString *result))block;;
dzięki, kurwa, składni blokowej! Ja też nigdy nie pamiętam tych rzeczy
Swift ma jakąś możliwość poprawy w tym zakresie, ponieważ nie musi to być jakiś dodatek do języka po przemyśleniu, można go wypalić od samego początku.
wynik może wyglądać na złożony (jak wszystkie deklaracje funkcji w funkcji), ale jest naprawdę prosty. Jest to po prostu definicja funkcji, która przyjmuje funkcję jako argument, więc dopóki rozumiesz zagnieżdżanie, powinno to szybko stać się jasne:
func hardProcessingWithString(input: String, completion: (result: String) -> Void) {...completion("we finished!")}
zamknięcie dopełnienia jest tutaj tylko funkcją, która pobiera łańcuch i zwraca void. Na początku brzmi to wstecz-to ma ciąg jako argument? Chcemy zwrócić ciąg! – ale tak naprawdę nie chcemy zwracać ciągu, to znaczy, że zablokowaliśmy, dopóki nie wrócimy. Zamiast tego wywołujemy funkcję, którą dał nam callee i dostarczamy im powiązane argumenty.
używanie programów do obsługi zakończeń jest łatwiejsze niż ich deklarowanie, dzięki sprytnemu sposobowi skrócenia wywołań funkcji od zespołu swift:
hardProcessingWithString("commands") {(result: String) inprint("got back: \(result)")}
to jest końcowe zamknięcie, coś, czego możemy użyć, gdy ostatni argument jest zamknięciem. Używając nieco dziwnej składni {() in }
, magicznie mamy wyniki, które przekazaliśmy z powrotem w naszej funkcji asynchronicznej. Naprawdę muszę jeszcze zanurzyć się w głębi Swifta, aby zrozumieć, co sprawia, że ta składnia się kleszczy, ale na razie cieszę się, że działa.