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

Typy danych

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

Float i Double

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

W Swiftcie Float przechowuje znacznie mniej danych niż Double, dlatego korzystaj z Double gdzie to tylko możliwe.

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.

Boolean

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

Używanie adnotacji typu mądrze

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"

LEARN SWIFTUI FOR FREE I have a massive, free SwiftUI video collection on YouTube teaching you how to build complete apps with SwiftUI – check it out!

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 us know!