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

Tablice

Tablice pozwalają na grupowanie wielu wartości w jeden zbiór, i dostęp do nich poprzez ich pozycję w tym zbiorze. Swift używa inferencji do ustalenia typów danych znajdujących się w tablicy:

var evenNumbers = [2, 4, 6, 8]
var songs = ["Shake it Off", "You Belong with Me", "Back to December"]

Jak widzisz, w Swifcie używa się nawiasów kwadratowych to oznaczenia początku i końca tablicy, a każdy jej element oddziela się przecinkiem.

Jeśli chodzi o odczyt danych z tablicy, to jest mała pułapka: Swift zaczyna liczyć od 0. To znaczy, że pierwszy element oznaczany jest jako 0, drugi jako 1, a trzeci jako 2, i tak dalej. Spróbuj wpisać do playground:

var songs = ["Shake it Off", "You Belong with Me", "Back to December"]
songs[0]
songs[1]
songs[2]

To wypisze "Shake it Off", "You Belong with Me", i "Back to December" w zakładce wyników.

Pozycja elementu tablicy nazywana jest indeksem, a odczyt danej wartości z tablicy odbywa się poprzez podanie indeksu. Jednakże musisz być ostrożny: nasz tablica ma 3 elementy, co oznacza, że indeksy, których możesz użyć to 0, 1 i 2, ale jeśli spróbujesz odczytać element z indeksem 3 - songs[3], playground przestaną działać. W przypadku prawdziwej aplikacji taka sytuacja zakończy się crashem.

Jeśli stworzysz tablicę podając 3 stringi, Swift domyśli się, że tablica ta składa się z elementów typu String. Możesz sprawdzić to używając specjalnej komendy w playground, który wypisze typ danych dowolnej zmiennej:

var songs = ["Shake it Off", "You Belong with Me", "Back to December"]
type(of: songs)

Taka komenda wypisze Array<String>.Type w zakładce wyników, co pokazuje, że Swift uznał zmienną songs jako tablica stringów.

Załóżmy, że zrobisz błąd, i przypadkowo wstawisz liczbę na koniec tablicy. Wypróbuj to, i zobacz co zostanie wyświetlone w zakładce wyników:

var songs = ["Shake it Off", "You Belong with Me", "Back to December", 3]
type(of: songs)

Tym razem zobaczysz błąd. Nie oznacza on, że Swift nie radzi sobie z mieszanymi zbiorami danych - pokażę Ci to za chwilę! - zamiast tego Swift stara się być pomocny. Błąd, który zobaczysz brzmi "heterogenous collection literal could only be inferred to '[Any]'; add explicit type annotation if this is intentional." albo po ludzku "wygląda na to, że tablica przechowuje różne typy danych - jeśli miałeś to na myśli, doprecyzuj to".

Bezpieczeństwo typów jest ważne, i mimo że, Swift radzi sobie z tworzeniem kolekcji z różnymi typami danych, to w tym przypadku był to przypadek. Na szczęście, jak powiedziałem, możesz użyć adnotacji typu do doprecyzowania jakie typy danych ma zawierać tablica. Aby wyszczególnić typ kolecji, zapisz typ danych w nawiasach kwadratowych:

var songs: [String] = ["Shake it Off", "You Belong with Me", "Back to December", 3]

Teraz powiedzieliśmy Swiftowi, że chcemy przetrzymywać tylko stringi w tablicy. Taka deklaracja nie pozwoli uruchomić programu, bo 3 nie jest typu String.

Jeśli rzeczywiście chciałbyś, żeby tablica zawierała różne typy, użyj specjalnego typu danych Any:

var songs: [Any] = ["Shake it Off", "You Belong with Me", "Back to December", 3]

Tworzenie tablic

Jeśli tworzysz tablicę używając składni pokazanej powyżej, Swift utworzy tablicę i wypełni ją określonymi wartościami. Nie jest to takie proste, jeśli chcesz stworzyć tablice, i wypełnić ją później - taka składnia nie zadziała:

var songs: [String]
songs[0] = "Shake it Off"

Powodem na pierwszy rzut oka wydaje się być nieco pedantyczny, ale ma zasadnicze implikacje wydajnościowe, więc obawiam się, że musisz do tego przywyknąć. Krótko mówiąc, napisanie var songs: [String] powie Swiftowi, że zmienna songs będzie tablicą stringów, ale nie tworzy tej tablicy. Instrukcja ta nie zaalokuje pamięci RAM, ani nie zrobi nic, żeby utworzyć tablicę. To tylko mówi, że kiedyś w tym miejscu pojawi się kolekcja trzymająca dane typu String.

Jest kilka sposobów, żeby wyrazić to właściwie, a ten prawdopodobnie będzie najbardziej sensowny w tym momencie:

var songs: [String] = []

Taki zapis używa adnotacji typu do określenia, że tworzymy tablicę stringów, i przypisujemy do niej pusty zbiór - to właśnie oznacza zapis []

Częstym zapisem jest również:

var songs = [String]()

To oznacza dokładnie to samo: użycie () mówi Swiftowi, że chcemy od razu utworzyć instancję tablicy. Taki zapis jest o 2 znaki krótszy, więc nie powinno być to niespodzianką, że właśnie taki sposób jest częściej spotykany u programistów!

Operatory tablic

Możesz wykorzystać ograniczoną ilość operatorów podczas operacji na tablicach. Na przykład możesz połączyć dwie talice, używając operatora +:

var songs = ["Shake it Off", "You Belong with Me", "Love Story"]
var songs2 = ["Today was a Fairytale", "Welcome to New York", "Fifteen"]
var both = songs + songs2

Aby dodać kolejną wartość do zbioru, użyj operator +=:

both += ["Everything has Changed"]

SPONSORED Instabug helps you identify and resolve severe crashes quickly. You can retrace in-app events and know exactly which line of code caused the crash along with environment details, network logs, repro steps, and the session profiler. Ask more questions or keep users up-to-date with in-app replies straight from your dashboard. Instabug takes data privacy seriously, so no one sees your data but you! See more detailed features comparison and try Instabug's crash reporting SDK for free.

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!