pisanie bloków z zamknięciami w języku Swift

nawet po tym, jak dobrze opanowałem koncepcję bloków, wciąż musiałem sprawdzać ich składnię za każdym razem, gdy chciałem napisać cokolwiek, ale nie najprostszy z bloków (dziękuję fuckingblocksyntax.com). Wersja Swifta bloków, znana jako zamknięcia, ma znacznie czystsze, bardziej naturalne podejście do składni. Więc bez zbędnych ceregieli, czas nauczyć się zamknięć tak, jak nauczył mnie mój tata: pisząc blok uzupełniający.

interfejs API animacji UIView jest jednym z najczęstszych obszarów, w których Programiści iOS używają bloków. Przed ślepym napisaniem własnej metody, spróbuj użyć jednego z próbek kodu Apple, aby zapoznać się ze składnią. Poniżej znajduje się przykład Objective-C, a następnie ten sam kod napisany w języku Swift:

Objective C:

Swift:

ku przerażeniu królików i krótkowzrocznych programistów, karetki ( ^ ) nie można znaleźć (jeszcze) w języku Swift. Spoczywaj w pokoju stary przyjacielu, zostałeś zastąpiony przez słowo kluczowe in. Używasz słowa kluczowego in po zakończeniu deklarowania parametrów i wartości zwracanych dla zamknięcia. Będzie to miało większy sens, jeśli pokażę Ci, co autouzupełnianie wypełniło się, gdy wiedział, jaką metodę chciałem:

UIView.animateWithDuration(duration: NSTimeInterval, animations: (() -> Void)?, completion: ((Bool) -> Void)?)

skupiając się na tej składni, staje się jasne, jak poprawnie zapisać parametry i zwracane wartości zamknięcia:

{(parameters) -> (return type) in expression statements}

w powyższym przykładzie kodu Swift oba zamknięcia animacji zwróciły void, więc mogliśmy porzucić składnię typu return razem. Dlatego funkcja ( ) jest widoczna tylko dla parametrów. Zauważ, że nawet jeśli nie ma żadnych parametrów, jak w pierwszym zamknięciu, nadal potrzebujesz tych empty ( ) przed słowem kluczowym in. Są wymagane. Pogrubione, żebyś to zapamiętał.

Ok, teraz spróbujmy napisać naszą własną metodę Swift z zamknięciem zakończenia. W repozytorium Github połączone na dole tego postu, pracowałem nad aplikacją klienta Github w języku Swift z zespołem kolegów kodu. W tym projekcie mamy kontroler sieciowy, który obsługuje wszystkie asynchroniczne wywołania sieciowe do API Githuba.

napiszmy metodę, która pobiera listę użytkowników z zapytania wyszukiwania na kliencie. Ta metoda będzie wymagała zamknięcia completion, aby informować żądający kontroler widoku o zakończeniu połączenia sieciowego i dostarczać szereg modeli użytkowników do wypełnienia naszego widoku kolekcji.

oto jak wyglądałaby sygnatura funkcji:

func searchUsersWithSearchTerm(searchTerm: String, completionClosure: (users :User) ->()) 

mamy tu dwa parametry: typ string o nazwie searchTerm i nasze zamknięcie zakończenia. Zauważyłeś składnię w parametrze zamknięcia? Najpierw jest nazwa naszego zamknięcia, tak jak nazwiemy je później w metodzie, następnie parametr (tablica użytkowników), a następnie nasza wartość zwrotna (void). Poniżej przybliżenie jak wygląda ciało tej metody:

 //setup a NSMutableRequest with the correct API URL and parameters //setup a dataTask on our NSURLSession instance //once our datatask has successfully retrieved the data we wanted, and we have parsed through it to create an array of User Models, we call our completion closure like this: var users : User = //Parse the JSON data into Users completionClosure(users: users)

wywołanie naszego zamknięcia dopełnienia w Swift jest prawie tak samo jak nazywamy nasz blok dopełnienia w Objective-C. nazywa się tak jak każda inna funkcja i upewniamy się, że przekażemy tablicę jako parametr, ponieważ tak zdefiniowaliśmy ją w naszej sygnaturze funkcji. Celowo pominąłem cały kod sieciowy, aby ten post był jak najkrótszy, ale możesz sprawdzić repozytorium Github, jeśli jesteś zainteresowany zobaczeniem, jak to działa. Planujemy w niedalekiej przyszłości zamieścić wpis na blogu w sieci w języku Swift.

na koniec rzućmy okiem na to, jak wywołalibyśmy tę metodę z naszego SearchUsersViewController:

jeszcze jedną rzeczą, na którą chcę zwrócić uwagę, jest to, jak nazwałem addOperationWithBlock() na naszej mainQueue(). Jeśli zamknięcie jest ostatnim parametrem podpisu funkcji, możesz użyć specjalnej składni, aby uczynić ją jeszcze bardziej czystą. Jest to określane jako zamknięcie końcowe. Końcowe zamknięcia są zapisywane bezpośrednio po wywołaniu funkcji (). Poniżej znajduje się wywołanie funkcji, najpierw z regularnym zamknięciem, a następnie z końcowym zamknięciem.

to subtelna różnica i oba sposoby działają. Pamiętaj tylko, że musi to być ostatni parametr funkcji, aby móc korzystać ze składni zamknięcia końcowego.

teraz powinieneś znać podstawową składnię zamknięć w języku Swift. Aby uzyskać bardziej zaawansowane informacje na temat zamknięć, zapoznaj się z językiem programowania Swift na iBooks. Ma na nich cały podrozdział. A oto link do projektu klienta github.

jest też już szybki odpowiednik dla fuckingblocksyntax.com nazywa się, zgadłeś, fuckingclosuresyntax.com, który zdecydowanie warto dodać do paska zakładek, gdy uczysz się Swift.

Dzień dobry.

chcesz zostać profesjonalnym programistą? Skontaktuj się dowiedz się jak!

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.