Swift #2. Typy

Nauka programownia

Opublikowany: Sep 17, 2018

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].

Memory_Int.png

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.


  1. …lub dopiero później, w kodzie programu, ale pod pewnym warunkiem, o którym później
  2. …czyli 32 bity na platformach 32 bitowych, 64 bity na platformach 64bitowych (Apple Watch S4+, iPhone 5s+)
  3. na pewno wrócimy do tego w przyszłości
  4. Więcej można przeczytać tu: Jak poprawnie zsumować milion floatów
  5. wspiera unicode, więc emotikonki też się da tu przechowywać


Image
Felieton
Zarabianie Schrodingera
Sep 03, 2019
Image
Felieton
Rozliczanie aplikacji sprzedanych w AppStore
Jun 10, 2019
Image
Felieton
Cały internet na płycie CD
Apr 01, 2019
Image
Nauka programownia
Swift: O co chodzi z tymi kolejkami?
Feb 17, 2019
Image
Felieton
Tim Cook docenił wzrost sprzedaży w Polsce
Feb 04, 2019

Nasze szkolenia

Image
Image
Programowanie aplikacji iOS w Swift 5
Dwudniowe szkolenie od podstaw
Toruń - 2020-03-14
dr Błażej Zyglarski
Image
Image
Objective-C dla programistów Swift
Jednodniowe szkolenie dla programistów Swift
Warszawa - 2020-01-11
dr Błażej Zyglarski
Image
Image
Programowanie Gier 2D na iOS
Trzydniowe szkolenie ze SpriteKit i GameplayKit dla programistów Swift
Toruń - 2020-03-27
dr Błażej Zyglarski