Jest wiele typów danych, a Swift obsługuje każdy z nich niezależnie. Już spotkałeś się z jednym z najważniejszych, kiedy przypisałeś kawałek tekstu do zmiennej. W języku Swift jest on nazywany String
– ciąg znaków ang. string of characters.
String może być bardzo długi (na przykład milion znaków), krótki (10 znaków), czy nawet pusty, nie ma to znaczenia: dla Swifta każdy z tych przykładów jest stringiem i działa tak samo. Swift wie, że name
powinien zawierać stringa, ponieważ określiłeś to przypisując "Tim McGraw". Jeśli spróbowałbyś zmienić napisany kod na ten poniżej, przestanie on działać:
var name
name = "Tim McGraw
W tym przypadku Xcode wyświetli błąd z wiadomością, która w tym momencie może nie mieć dla ciebie zbyt wiele sensu: "Type annotation missing in pattern". To, co Xcode naprawdę chce powiedzieć, to "Nie wiem jaki typ danych ma przechowywać zmienna name
, bo nie dałeś mi wystarczająco dużo informacji."
W tym momencie masz dwie możliwości: utworzyć zmienną i nadać jej początkową wartość w jednej linii kodu, lub użyć tak zwanej adnotacji typu ang. type annotation
, czyli określić samemu jakiego typu dane będzie przechowywała zmienna, nawet jeśli nie chcesz przypisać jej wartości na początku.
Pierwszą opcję już widziałeś, dlatego przyjrzyjmy się teraz drugiemu rozwiązaniu: z wykorzystaniem adnotacji typu. Wiemy, że name ma być stringiem. Możemy to powiedzieć Swiftowi pisząc String
poprzedzone dwukropkiem. O tak:
var name: String
name = "Tim McGraw"
W prawdziwych aplikacjach - w przeciwieństwie do Playgrounds - to zadziała, bo Swift będzie wiedział jaki typ danych będzie przechowywać name
. Playgrounds są szczególnym przypadkiem, dlatego błąd nie zniknie.
Uwaga: niektórzy lubią używać spacji przed i po dwukropku, pisząc var name : String, ale są oni w błędzie. Postaraj się jednak unikać wytykania tego błędu będąc w kulturalnym towarzystwie.
Ważne w tej lekcji jest to, że Swift zawsze chce znać jaki typ danych przechowuje każda zmienna czy stała. Zawsze. Nie można od tego uciec, i jest to dobrze, bo fakt ten zapewnia coś, co nazywane jest bepieczeństwem typu ang. type safety
- jeśli zadeklarujesz, że "to będzie stringiem", to spróbuj tam włożyć królika. Swift odmówi.
Możemy to wypróbować wprowadzając inny ważny typ danych, "integer", lub krócej Int. Inty to liczby całkowite jak 3, 30, 300, czy -16777216. Na przykład:
var name: String
name = "Tim McGraw"
var age: Int
age = 25
Widzimy tu dwie zmienne, jednego stringa, i jeden int. Zauważ, że oba String
i Int
pisane są wielką literą, a name
i age
nie - jest to standardowe nazewnictwo w Switcie. Konwencja programistyczna to pewna umowa, którą nie przejmuje się Swift, a przejmują się inni programiści. W tym przypadku deklaracje typu danych rozpocznają się wielką literą, a nazwy zmiennych i stałych małą.
Teraz kiedy mamy deklaracje dwóch zmiennych z różnymi typami, możemy sprawdzić bezpieczeństwo typu w akcji. Spróbuj napisać:
name = 25
age = "Tim McGraw"
Tymi instrukcjami próbujesz podstawić integera pod zmienną trzymającą stringa, a stringa pod zmienną z typem całkowitoliczbowym - i na szczęście Xcode wyświetli błąd. Możesz myśleć, że jest to nieco pedantyczne, ale w zasadzie jest bardzo pomocne: deklarujesz, że zmienna będzie trzymała jeden, określony typ danych, i Xcode dopilnuje, żeby tak było podczas twojej pracy.
Zanim przejdziesz dalej, usuń obie linie powodujące błąd, w przeciwnym razie nic więcej nie zadziała w Playgrouds
Przejdźmy do dwóch kolejnych typów danych zwanych Float
i Double
. W taki sposób Swift przechowuje liczby z częścią ułamkową, jak 3.1, 3.141, 3.1415926, i -16777216.5. Przewidziane są dwa różne typy danych, aby tobie pozostawić wybór jak dokładną wartość potrzebujesz. Choć w większości przypadków nie ma znaczenia, który typ wybierzesz, to Apple sugeruje używanie Double
, który jest dokładniejszy,
Spróbuj dopisać w Playgrounds:
var latitude: Double
latitude = 36.166667
var longitude: Float
longitude = -86.783333
Możesz zauważyć, że obie liczby pojawią się po prawej stronie, ale zwróć uwagę, że jest drobna rozbieżność. Zadeklarowaliśmy zmienną longitude
z wartością -86.783333, ale w zakładce wyników widnieje -86.78333 - brakuje 3 na końcu. Możesz pomyśleć, "w czym może przeszkodzić tak mała różnica?", jest to jednak przykład, który dobrze obrazuje różnice w dokładności.
Dzięki temu, że Playgrounds aktualizuje wyniki z każdym dodanym znakiem, możemy dokładnie zobaczyć jak Float
i Double
się różnią. Spróbuj wpisać:
var longitude: Float
longitude = -86.783333
longitude = -186.783333
longitude = -1286.783333
longitude = -12386.783333
longitude = -123486.783333
longitude = -1234586.783333
Zwiększamy tu liczbę znaków przed przecinkiem, zachowując tą samą wartość po przecinku. Jeśli jednak spojrzysz na zakładkę wyników, możesz zauważyć, że za każdym razem, kiedy dodasz cyfrę przed przecinkiem, Swift usunie jedną cyfrę po przecinku. Dzieje się tak, ponieważ ma określone miejsce, w którym może przechować liczbę, przechowuje więc bardziej znaczącą część - o ile 1,000,000 naprawdę ma znaczenie, to 0.000003 już trochę mniejsze
Teraz spróbuj zmienić Float
na Double
i sprawdź, że Swift wyświetli właściwą wartość dla każdego przykładu:
var longitude: Double
Po raz kolejny - dzieje się tak dlatego, że Double
ma dwukrotnie większą dokładność niż Float
, więc nie musi przycinać liczb, by zmieścić się się w określonym rozmiarze. Jednakże, próbując podstawić naprawdę dużą liczbę jak 123456789.123456789, to zostanie obcięta do 123456789.12345679.
Swift ma wbudowany typ danych odpowiedzialny za przechowanie wartości logicznej - prawda i fałsz. Boolean, lub krócej Bool
określa prawdziwość danego wyrażenia, nie ma więc tu miejsca na "być może". Na przykład:
var stayOutTooLate: Bool stayOutTooLate = true
var nothingInBrain: Bool nothingInBrain = true
var missABeat: Bool missABeat = false
Jak zdążyłeś się nauczyć, Swift ma dwa sposoby na określenie typu danych przechowywanych przez zmienną: podstawienie wartości podczas inicjalizacji zmiennej, lub użycie adnotacji typu. Jeśli masz wybór, użyj pierwszego sposobu, ponieważ jest bardziej przejrzysty. Na przykład:
var name = "Tim McGraw"
…jest bardziej polecane niż:
var name: String
name = "Tim McGraw"
Tyczy się to wszystkich typów danych. Na przykład:
var age = 25
var longitude = -86.783333
var nothingInBrain = true
Ta własność jest nazywana inferencją typów ang. type inference
, ponieważ Swift potrafi określić typ danych na podstawie podstawionej wartości. W przypadku liczby jak -86.783333, Swift zawsze wybierze Double
zamiast Float
.
Chcąc wyczerpać temat, muszę dodać, że możliwe jest określenie typu i zainicjalizowanie zmiennej w tym samym czasie, o tak:
var name: String = "Tim McGraw"
SPONSORED Alex is the iOS & Mac developer’s ultimate AI assistant. It integrates with Xcode, offering a best-in-class Swift coding agent. Generate modern SwiftUI from images. Fast-apply suggestions from Claude 3.5 Sonnet, o3-mini, and DeepSeek R1. Autofix Swift 6 errors and warnings. And so much more. Start your 7-day free trial today!
Sponsor Hacking with Swift and reach the world's largest Swift community!
Link copied to your pasteboard.