SALE ENDS TODAY: Save 50% on all Swift books and bundles! >>

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"

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.

Save 50% on all books and bundles

The biggest ever Hacking with Swift sale is now on, letting you save 50% on all books and bundles. Learn something new with Swift and enjoy great savings while the sale lasts!

Click here to save 50% in our Black Friday sale!

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!