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]
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!
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 Join a FREE crash course for mid/senior iOS devs who want to achieve an expert level of technical and practical skills – it’s the fast track to being a complete senior developer! Hurry up because it'll be available only until September 29th.
Sponsor Hacking with Swift and reach the world's largest Swift community!
Link copied to your pasteboard.