NEW: Join my free 100 Days of SwiftUI challenge today! >>

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.

SAVE 20% ON iOS CONF SG The largest iOS conference in Southeast Asia is back in Singapore for the 5th time in January 2020, now with two days of workshops plus two days of talks on SwiftUI, Combine, GraphQL, and more! Save a massive 20% on your tickets by clicking on this link.

BUY OUR BOOKS
Buy Pro Swift Buy Swift Design Patterns Buy Testing Swift Buy Hacking with iOS Buy Swift Coding Challenges Buy Swift on Sundays Volume One Buy Server-Side Swift (Vapor Edition) Buy Advanced iOS Volume One Buy Advanced iOS Volume Two Buy Advanced iOS Volume Three Buy Hacking with watchOS Buy Hacking with tvOS Buy Hacking with macOS Buy Dive Into SpriteKit Buy Swift in Sixty Seconds Buy Objective-C for Swift Developers Buy Server-Side Swift (Kitura Edition) Buy Beyond Code

Was this page useful? Let us know!