Jeżeli chcesz rozpocząć przygodę z programowaniem w Swift, ale nie wiesz nic o programowaniu wogóle, to miejsce jest dla Ciebie! Zacznij od Swift #1: Podstawy, a potem wróć tutaj.
Podsumowując pierwszą część, aby stworzyć zmienną, musimy określić jej typ i identyfikator (nazwę). Identyfikator jest ciągiem złożonym z liter, cyfr i innych znaków, nie zaczynającym się od cyfry, w którym nie występują znaki specjalne, takie jak spacja (odstęp), kropka, średnik itp. Służy on do odwoływania się do zmiennej. Typ określa rodzaj przechowywanych w zmiennej danych. Deklarując zmienną informujemy kompilator o jej identyfikatorze i typie. Przypisanie wartości (wykonywane za pomocą operatora =) do zmiennej musi nastąpić podczas deklaracji [1] Wartość przechowywana w zmiennej może zostać zmieniona. Zauważmy, że przy zapisie wartości zmiennych typu rzeczywistego część całkowita jest oddzielona od części ułamkowej kropką.
W niektórych przypadkach będziemy chcieli jawnie określić typ zmiennej, nie pozostawiając pola do popisu kompilatorowi. Wówczas możemy skorzystać z notacji :. Takie rozwiązanie pozwoli na wymuszenie typu, w przypadku gdy wyrażenie inicjalizujące nie jest do końca zgodne z oczekiwanym typem.
var zmiennaTypuInt = 4
var zmiennaDouble:Double = 4
PODSTAWOWE TYPY DANYCH
W języku Swift można znaleźć między innymi proste typy całkowitoliczbowe (Int, Uint8), zmiennoprzecinkowe (Float, Double), znakowe (Character).
ar zmiennaDouble:Double = 4
var zmiennaInt = 5
var zmiennaFloat = 5.5
DLA POOCZĄTKUJĄCYCH: TYPY CAŁKOWITOLICZBOWE
Tym, którzy przez chwilę zapomnieli czym jest komputer, trzeba przypomnieć, że jest to urządzenie działające w oparciu o płynący prąd. Stąd podstawowymi stanami tego urządzenia jest przepływ lub brak przepływu prądu. W wielkiej ogólności stąd wywodzi się również podstawowa jednostka zapisu danych: bit, który przyjmuje wartości 0 i 1.
Zastanówmy się więc jak za pomocą zer i jedynek zapisać na przykład liczbę całkowitą? Otóż dzieje się to za pomocą zapisu binarnego. Każdą liczbę całkowitą da się zapisać jako sumę potęg dwójki. Dlaczego dwójki? Bo mamy dwa stany / wartości bitu.
I tak:
1 = 2^0 2 = 2^1 4 = 2^2 8 = 2^3
Łatwo zauważyć, że zidentyfikowaliśmy liczby, które są po prostu potęgami 2. A jak w takim razie określić wartości, które nie są potęgami 2? Przez sumowanie
3 = 2 + 1 = 2^1 + 2^0 5 = 4 + 1 = 2^2 + 2^0 7 = 4 + 2 + 1 = 2^2 + 2^1 + 2^0 18 = 16 + 2 = 2^4 + 2^1
Jak widać w powyższym zapisie pominęliśmy kilka składników (na przykład w zapisie liczby 18 pominęliśmy trzecią, drugą i zerową potęgę dwójki. Poprawmy ten zapis
3 = 1* +1*1 = 1*2^1 + 1*2^0 5 = 1*4 + 0*2 + 1*1 = 1*2^2 + 0*2^1 + 1*2^0 7 = 1*4 + 1*2 + 1*1 = 1*2^2 + 1*2^1 + 1*2^0 18 = 1*16 + 0*8 + 0*4 + 1*2 + 0*1 = 1*2^4 + 0*2^3 + 0*2^2 + 1*2^1 + 0*2^0
W każdej z powyższych sum jest jeszcze wiele składników wymnożonych przez zero z lewej strony wypiszemy wszystkie do 4 potęgi dwójki.
3 = 0*16 + 0*8 + 0*4 + 1*2 +1*1 = 0*2^4 + 0*2^3 + + 0*2^2 + 1*2^1 + 1*2^0 5 = 0*16 + 0*8 + 1*4 + 0*2 + 1*1 = 0*2^4 + 0*2^3 +1*2^2 + 0*2^1 + 1*2^0 7 = 0*16 + 0*8 + 1*4 + 1*2 + 1*1 = 0*2^4 + 0*2^3 + 1*2^2 + 1*2^1 + 1*2^0 18 = 1*16 + 0*8 + 0*4 + 1*2 + 0*1 = 1*2^4 + 0*2^3 + 0*2^2 + 1*2^1 + 0*2^0
Stąd jest już bardzo krótka droga do zdefiniowania zapisu binarnego. W zapisie binarnym określamy tylko, czy kolejne potęgi dwójki mają wystąpić w sumowaniu, czyli czy są pomnożone przez 0 czy przez 1…
Zatem mamy, że
3 = 00011 5 = 00101 7 = 00111 18 = 10010
Oczywiście mając do dyspozycji 5 znaków, musielibyśmy zadowolić się bardzo małym zakresem liczb. (
ZADANIE 1:
Jaką największą liczbę całkowitą dałoby się zapisać mając dostęp do ciągu 5 znaków (zer i jedynek)?
Dlatego używa się raczej zapisów 32bitowych (o długości 32 bitów – Int) lub 64bitowych (Long).
Co się więc dzieje gdy uruchomimy kod
var i = 16
W pamięci zostanie zarezerwowany obszar odpowiadający typowi Int [2].
Zarezerwowany obszar będzie również wypełniony odpowiednimi wartościami (czyli zerami i jedynkami)
Typ zmiennej powie kompilatorowi jak duży to ma być obszar. A sama zmienna będzie przede wszystkim pamiętać w jaki miejscu pamięci ten obszar się rozpoczyna.
Chcąc odczytać zmienną z pamięci…
print (i)
… kompilator ponownie sprawdzi jej typ i odczyta konkretną ilość bitów z pamięci wskazywanej przez zmienną (w przypadku powyższego kodu i telefony iPhone X będzie to 64 bity).
KTOŚ ZAPYTA: A CO Z LICZBAMI UJEMNYMI?
Jest to bardzo dobra uwaga. Zmienne typu Int mogą przechowywać wartości ujemne. Pierwszy bit pamięci jest bitem specjalnym, mówiącym jaki jest znak całej liczby (0 – dodatni, 1 – ujemny). Dopiero pozostałe 63 bity określają sumowanie wyznaczające przechowywaną wartość.
ZADANIE 2.
Policz, jakie są największe i najmniejsze wartości, które mogą być przechowywane w iPhone 8 w zmiennej typu Int.
INNE TYPY DANYCH
Podsumowując, typ Int mówi kompilatorowi jaka ilość danych mieści się w konkretnym miejscu w pamięci i w jaki sposób reprezentowane. Podobnie z innymi typami danych, każdy z nich określa w jaki sposób za pomocą zer i jedynek przedstawić konkretną wartość[3].
TYPY DANYCH W SWIFT
Spójrzmy zatem na konkretną listę prostych typów danych dostępnych w języku Swift.
TYPY CAŁKOWITOLICZBOWE
Dostępnych jest 8 typów całkowitoliczbowych, przy czym
Int8 8 bitowy Int ze znakiem
Int16 16 bitowa liczba całkowita ze znakiem
Int32 32 bitowa liczba całkowita ze znakiem
Int64 64 bitowa liczba całkowita ze znakiem
Int zależny od typu procesora w urządzeniu i rónoważny z Int32 lub Int64
Oprócz typów ze znakiem są również dostępne typy bez znaku, w których pierwszy bit jest składową braną pod uwagę przy obliczaniu wartości.
UInt8 8 bitowy Int bez znaku
UInt16 16 bitowa liczba całkowita bez znaku
UInt32 32 bitowa liczba całkowita bez znaku
UInt64 64 bitowa liczba całkowita bez znaku
ZADANIE 3.
Ile różnych wartości można przypisać do zmiennej typu Int64 i do zmiennej typu UInt64? Czy ta ilość jest różna? Dlaczego?
TYPY ZMIENNOPRZECINKOWE
Podobnie jak w matematyce mamy możliwość wykorzystania liczb rzeczywistych. Jednak w związku ze sposobem reprezentacji danych w formie zer i jedynek są one przedstawiane z pewną dokładnością[4]. I tak w Swift mamy dostępne:
Float Liczby zmiennoprzecinkowe pojedynczej precyzji (dokładność mniejsza)
Double Liczby zmiennoprzecinkowe podwójnej precyzji (dokładność większa)
Oto przykłady deklaracji i nicjalizacji zmiennych różnych typów:
var n1 = 1 //typ Int
var n2:Double = 1 //typ Double
var n3 = 1.1 //typ Double
var n4:Int8 = 1 //typ Int8
TYP LOGICZNY (BOOLOWSKI)
Kolejnym bardzo ważnym typem prostym jest typ boolowski, pozwalający przyjąć wartości logiczne, czyli prawdę (true) lub fałsz (false).
Typ ten jest niezbędny do pisania kodu, w którym chcemy podjąć jakieś decyzje (tzn., że program zachowa się różnie w przypadku różnych danych na których będzie pracował.)
var b1 = true
var b2 = false
TYP ZNAKOWY
Ostatnim typem prostym jest typ znakowy, który pozwala przechowywać znaki alfabetu[5]
var c1 = "1"
var c2 = "c"
Poza tymi typami mamy szeroką gamę typów złożonych, którymi zajmiemy się w kolejnych częściach kursu.
- …lub dopiero później, w kodzie programu, ale pod pewnym warunkiem, o którym później
- …czyli 32 bity na platformach 32 bitowych, 64 bity na platformach 64bitowych (Apple Watch S4+, iPhone 5s+)
- na pewno wrócimy do tego w przyszłości
- Więcej można przeczytać tu: Jak poprawnie zsumować milion floatów
- wspiera unicode, więc emotikonki też się da tu przechowywać