NEW: Get your ticket for Hacking with Swift Live 2019! >>

< Previous: Polimorfizm i Konwersja typu   Table of Contents >

Domknięcie (closure)

Poznałeś już integer'y, string'i, double, float'y, bool'e, tablice, słowniki, struktury i klasy ale jest jeszcze jeden typ danych często używanych w Swifcie. Nazywa się go closure (domknięcie). Ten typ jest skomplikowany, ale jest także tak niesamowicie potężny i ekspresywny, że używany jest tak często w Cocoa Touch, że daleko nie zajdziesz bez jego znajomości.

Domknięcie może być określane jako zmienna, która trzyma kod. Więc tak jak integrer trzyma wartość 0 lub 500, domknięcie trzyma pare linijek Swiftowego kodu. Różni się on jednak od funkcji. Ponieważ domknięcie jest typem danych możesz przekazywać go jako parametr lub trzymać jako wartość. Domknięcie trzyma także kopie środowiska, w którym został stworzony, co znaczy, że posiada on wszystkie kopie wartości, które są w nim używane.

Nigdy nie będziesz potrzebować projektować własnego domknięcia dlatego nie martw się jeśli jeszcze ich nie rozumiesz. Zarówno Cocoa jak i Cocoa Touch będzie często wymagać je pisać, więc warto zrozumieć jak działają. Weźmy przykład z Cocoa Touch:

let vw = UIView()

UIView.animate(withDuration: 0.5, animations: {
    vw.alpha = 0
})

UIView jest typem danych w UIKit, który reprezentuje najbardziej podstawowy widok interface'u użytkownika. Nie martw się teraz tym co robi ten widok. UIView posiada metodę o nazwie animate(), która pozwala na animacje interface'u - Ty decydujesz co się zmienia i przez jaką ilość czasu, a Cocoa Touch zajmie się resztą.

Metoda animate() przyjmuje dwa parametry. Ilość sekund, przez które ma się wykonywać animacja oraz domknięcie z kodem opisującym animowane elementy. W podanym przykładzie wybrałem pół sekundy jako pierwszy parametr. Jako drugi parametr poleciłem UIKit, aby ten ustawił alfę widoku (przezroczystość) do zera - czyli uczynił go przezroczystym.

Ta metoda używa domknięcia, ponieważ UIKit musi dokonać wielu przygotowań, zanim animacja się zacznie. Działa to w ten sposób, że UIKit kopiuje kod, który znajduje się w nawiasach (to nasze domknięcie), zapisuje go, przygotowuje się do wykonania animacji i dopiero wtedy odpala nasz kawałek. To nie byłoby możliwe, gdyby uruchamiał go od razu.

Kod powyżej pokazuje także jak domknięcie zapisuje środowisko, w którym się znajduje. Zadeklarowałem stałą vw poza domknięciem, a potem użyłem ją w środku. Swift wykrył to i umożliwił użycie danych w tym domknięciu.

Automatyczny system wykrywania środowiska przez domknięcia w Swifcie jest bardzo pomocny, lecz czasami może działać na Twoją niekorzyść: Jeśli obiekt A przetrzymuje domknięcie jako zmienną, która jednocześnie odwołuje się do obiektu A, to tworzy się "strong reference cycle" (cykl silnych referencji), który może sprowadzić całą masę problemów na użytkowników. Ten temat jest bardziej zaawansowany, dlatego proszę nie przejmuj się nim jeszcze.

Domknięcie kończące (trailing closure)

Jako, że domknięcia są używane dość często, Swift posiada specjalną składnię do ich obsługi. Zasada jest prosta: jeśli ostatni parametr to domknięcie, możesz go eliminować z nawiasów, a zamiast tego dodać blok kodu w nawiasie klamrowym. Poprzedni przykład wyglądałby więc następująco:

let vw = UIView()

UIView.animate(withDuration: 0.5) {
    vw.alpha = 0
}

To sprawia, że kod jest krótszy i czyta się go lepiej, więc ta forma składni, zwana także jako trailing closure - jest preferowana.

HACKING WITH SWIFT LIVE This July is a new two-day event where you'll be inspired by great speakers on day one then learn all the amazing new features from WWDC on day two – click here for more information and tickets.

< Previous: Polimorfizm i Konwersja typu   Table of Contents >
MASTER SWIFT NOW
Buy Testing Swift Buy Practical iOS 12 Buy Pro Swift Buy Swift Design Patterns Buy Swift Coding Challenges Buy Server-Side Swift (Vapor Edition) Buy Server-Side Swift (Kitura Edition) Buy Hacking with macOS Buy Advanced iOS Volume One Buy Advanced iOS Volume Two Buy Hacking with watchOS Buy Hacking with tvOS Buy Hacking with Swift Buy Dive Into SpriteKit Buy Swift in Sixty Seconds Buy Objective-C for Swift Developers Buy Beyond Code

Was this page useful? Let me know!

Click here to visit the Hacking with Swift store >>