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.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.