1. díl - Úvod do jazyka Swift

Ostatní jazyky Swift Úvod do jazyka Swift

V tomto článku se podíváme na základní charakteristiky jazyka Swift. Jedná se o relativně mladý jazyk (2014) od firmy Apple zamýšlený jako alternativa k Objective-C. Oproti němu by měl omezit množství možných chyb, kterých se mohou programátoři dopustit. Primární využití je samozřejmě vývoj aplikací pro iOS a OS X.

Swift

Swift je C-like jazyk. To znamená, že jeho syntaxe je podobná syntaxi C. Například využívá bloky uzavřené složenými závorkami {}, dvojité lomeno jako komentář, na začátku dokumentu by měla být dokumentace, importování knihoven atd. Na rozdíl od C ale nevyžaduje středníky za příkazy a závorky u podmínek řídících konstrukcí (if, for, while). Mimo jiné je Swift (od verze 2.0) open-source, lze jej tedy upravit a využít i na jiných platformách.

Xcode

Pracovat budeme v prostředí Xcode. Jedná se o bohaté prostředí nabízející různé nástroje pro vývoj v Objective-C a Swiftu. My budeme používat poslední stabilní verzi a budou nám stačit dvě součásti - Swift 3.0 a Storyboard Editor.

Nainstalujte si Xcode a můžeme začít. Dnes se podíváme na základní konstrukce.

Základní konstrukce jazyka Swift

Proměnné a Konstanty

Proměnná je pojmenované místo v paměti do kterého můžeme ukládat data. Zapisuje se následovně:

var proměnná: DatovýTyp = Hodnota

Konstanta je hodnota, která se nemá při běhu programu nijak změnit. Syntaxe je následující:

let konstanta: DatovýTyp = Hodnota

Ve Swiftu je dobrým zvykem vytvářet raději konstanty nežli proměnné. Kromě vyššího výkonu (použitím konstanty ušetříme přístup do paměti) tato praxe také snižuje riziko chyby (Swift nás nenechá do konstanty nic přiřadit, takže si ji nemůžeme omylem přepsat na jinou hodnotu a pak zoufale hledat chybu).

Zkuste přijít na to, kde je v následujícím kódu chyba:

var jméno: String = "Jan Novák"
let povolání = "Zedník"

let věk: Int = 13
let ahoj = "Ahoj"

ahoj = "Čau"

Typ Int je celé číslo, které mění svůj rozsah závisle na platformě (na 64-bitové je to Int64 atd.). Dejte si pozor na přetečení!

Podporuje sčítání (+), odčítání (-), násobení (*), dělení (/) a modulo (%).

Typ String je textový řetězec s (prakticky) neomezenou délkou. Podporuje spojování (+).

Není to řádek 2. kde je vynechán datový typ (jak by si mnozí mysleli), je to řádek poslední, kde přepisujeme konstantu. U proměnných a konstant datový typ vynechat můžeme (kompilátor by měl sám poznat, co mu tam přiřazujeme), ale může to mít někdy (u komplikovanějších typů) neblahé následky.

Proměnné jsou staticky typované (můžeme přiřadit pouze typ, se kterým byly deklarovány).

Kde bude chyba tentokrát (vynechám typy, aby to bylo trochu nepřehlednější)?

var jméno = 13
let věk = 12345678900987654321

let kdeco = "cokde"
jméno = "Pan Tau"
let cokde = kdeco

Chyba nastane na řádku předposledním, kde se snažíme uložit String do typu Int. Pokud bychom chtěli do proměnné uložit obsah proměnné jiného typu, využijeme přetypování:

let jméno: String = "13"
let věk: Int = Int(jméno)!

U Int musíme "rozbalit" přetypovanou hodnotu, protože jde o volitelný typ (o tom později). Pokud bychom chtěli převést například Int na String nebo Bool, použijeme následující kód:

String(nějakýInt)
Bool(nějakýInt)

Bool je typ nabývající hodnot true nebo false - Ano nebo Ne. Na Bool se dá přetypovat prakticky cokoli. Zrovna Int bude false, pokud bude roven 0, jinak bude true.

Logické operátory

Operátory pro porovnání jsou:

  • '==' - Rovná se.
  • '<' - Menší než.
  • '>' - Větší než.
  • '!=' - Nerovná se.
  • '<=' - Menší nebo rovno.
  • '>=' - Větší nebo rovno.

Booleanovské operátory:

  • '&&' - A - Obě větve musí být pravdivé - 'true && true == true', 'true && false == false'.
  • '||' - Nebo - Jedna z větví musí být pravda - 'false || false == false', 'false || true == true', 'true || true == true'.
  • '!' - Ne - převrátí Bool hodnotu - '!true == false', '!false == true'.

Logické a Booleanovské operátory je možné použít na cokoliv:

let hodnota1: String = "Ahoj světe!"
let hodnota2: String = "134"
let hodnota3: String = "Hello world!"
var hodnota4: Bool = false

hodnota1 == hodnota2 // false; Jiná hodnota

hodnota4 = !hodnota1.isEmpty && !hodnota2.isEmpty // true; Žádná nejsou prázdné
!hodnota1.isEmpty || hodnota4 // true; První není prázdná (druhá se nevyhodnocuje, je to zbytečné)

hodnota1 != hodnota2 && hodnota4 // true; "Ahoj světe!" se nerovná "134" -> true, true && true -> true
Blok

Kód se dělí do bloků se syntaxí:

{
    // Nějaký kód
}
Řídící konstrukce - if

Asi nejběžnější řídící konstrukcí je if - podmínka. Má syntaxi:

if podmínka {
    // Kód provedený pokud je podmínka true
} else {
    // Kód provedený pokud je podmínka false
}

// Program zde pokračuje.

Větev else je možné vynechat. V jednotlivých větvích mohou být další podmínky:

if podmínka {
    // Něco
} else {
    if jiná podmínka {
        // Něco jiného
    } else {
        // ...
    }
}

Zkrácená verze:

if podmínka {
    // Něco
} else if jiná podmínka {
    // Něco jiného
} else {
    // Něco úplně jiného
}

Pro procvičení zkusíme zase najít chybu:

Příklad 1:

let jméno: String = "Jan Novák"
let věk: Int = 17

var plnoletý: Bool // Zde není chyba, pokud uvedeme u proměnné typ, můžeme ji nechat prázdnou

if věk >= 18 {
    plnoletý = true

Příklad 2:

if true {
    let něco: String == "Ahoj světe!"
}

Příklad 3:

let jméno: String = "Někdo úplně jiný"

if jméno = "Pan Tau" {
    let onJePanTau: Bool = true
} else {
    let onJeNěkdoJiný: Bool = true
}

Příklad 4:

let něco: Bool = false

if něco {
    let zaručeněSeNeprovede: Bool = true
} else {
    let zaručeněSeProvede: Bool = true
} else if něco == false {
    let zaručeněSeProvede: Bool = false
}

Příklad 1: Vynechaná ukončovací závorka.

Příklad 2: Neplatný přiřazovací operátor ('==').

Příklad 3: Neplatný porovnávací operátor ('=').

Příklad 4: else musí být poslední větev podmínky - zde za ní následuje další.

Řídící konstrukce - while, do while

While je cyklus, který se provádí, dokud platí zadaná podmínka. Má syntaxi:

while podmínka {
    // Kód
}

Pokud chceme zajistit, aby cyklus proběhl alespoň jednou (nehledě na platnost podmínky), použijeme do while.

do {
    // Kód
} while podmínka
Řídící konstrukce - for
for

Cyklus for je velice užitečný cyklus, používaný zejména u polí.

for konstanta in pole {
    // Kód
}

Tento cyklus projde všechny položky pole. Aktuální položka je uložena v konstantě určené v hlavičce.

Příklad:

for číslo in 1...10 { // začátek...konec je zápis uzavřeného intervalu -> vytvoří pole.
    print(číslo)
} // 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Intervaly

Interval je užitečný při rychlém vytváření polí, které obsahují po sobě jdoucí čísla.

Příklad:

1...10 // Uzavřený, obsahuje i poslední hodnotu, [1,2,3,4,5,6,7,8,9,10]
1..<10 // Polouzavřený, neobsahuje poslední hodnotu, [1,2,3,4,5,6,7,8,9]
Pole

Pole je seznam prvků se stejným datovým typem. Zapisuje se: [DatovýTyp]

Takže příkladem:

var pole1: [String] = [String](arrayLiteral: "Hello", "world") // Pole se zápisem konstruktoru pro pole typu String.
let pole2: [Int] = [1,2,3] // Pole obsahující tři položky typu Int

pole1 = [] // Nyní je toto pole prázdné ale svůj typ si zachovává.
pole1.append("13") // Toto je funkce volaná na objektu. Zde jsme přidali položku String("13").

Pole také podporuje operátor spojení (+), který spojí dvě pole. U inicializace prvního pole jsme se setkali s arrayLiteral:. Jde o takzvaný pojmenovaný argument, o kterém se více dočtete u funkcí v příštím díle.

Příště se podíváme na některé další konstrukce, vícetypová pole a funkce.


 

  Aktivity (3)

Článek pro vás napsal jan.ruzicka01
Avatar
Autor se věnuje programovaní v Pythonu, Ruby, Javě a trochu C#. Dříve tvořil aplikace v C/C++. Nyní se zajímá o webové technologie a tvorbu virtuálních strojů (/programovacího jazyka).

Jak se ti líbí článek?
Celkem (11 hlasů) :
4.181824.181824.181824.18182 4.18182


 


Miniatura
Všechny články v sekci
Swift
Miniatura
Následující článek
Swift - Pole, funkce, operátory

 

 

Komentáře
Zobrazit starší komentáře (3)

Avatar
coells
Redaktor
Avatar
coells:

To je odkaz na C++ referenci, ale mluvíme o Swiftu, ne?
Rozsah Intu se dá překročit velice snadno, stačí na to jediné odečtení jedničky, o to jednodušší je to s cloudovým sdílením dokumentů.

Mám pravdu ve všem, co jsem napsal, ale kde se tady vzal Python, to už vůbec nechápu?
Ty chyby v článku jsou vidět od oka, pokud jsi ve Swiftu alespoň chvilku programoval.

A pokud jsem to předtím neřekl jasně, tak ne, neuvedení typu nesnižuje výkon. Je to stejně rychlé, jako když typ uvedeš.

 
Odpovědět  +2 17.8.2015 9:33
Avatar
Nevim
Člen
Avatar
Odpovídá na coells
Nevim:

Koukám na to a taky se mi to nezdá úplně ok ....

 
Odpovědět 17.8.2015 9:55
Avatar
jan.ruzicka01
Redaktor
Avatar
Odpovídá na coells
jan.ruzicka01:

Ano, jestli teda chceš, uvedu i Int32, Int16 a Int8 ale defaultní Swiftový Int je Int64 (u 64-bitových platforem) nebo Int32 (u 32-bitových platforem) a jelikož ve Swiftu bude většina lidí programovat na Macu a všechny Macy s Intel Core i3 a vyšší jsou 64-bitové, je vhodnější uvést právě Int64. Samozřejmě že se rozsah Intu dá překročit (nebo podkročit), ale v mých příkladech se to nestane a v pozdějších dílech napíšu o operátorech přetečení, které alespoň odchytí chyby.

O Pythonu je řeč proto, protože v jsem v něm programoval velký projekt a proto jsem si zvykl na dynamické typování a větší volnost ohledně porovnání typů.

Tento článek jsem psal už dávno a pak se mi podělal Xcode a tak jsem to vzdal. Začal jsem s Pythonem a teď, když pokračuju jsem někdy sám překvapen ale mohu tě ujistit, že nyní všechny příklady, které uvádím a všechno, co zde píšu, mám kompletně otestováno ve svém Xcode a vše funguje, jak má.

Odpovědět  -2 17.8.2015 10:00
';' je má jediná noční můra...
Avatar
Juraj Mlich
Redaktor
Avatar
Juraj Mlich:

By the way, ...

Odpovědět 17.8.2015 10:06
Vždy je lepšie učiť sa z cudzích chýb, než z vlastných chýb.
Avatar
coells
Redaktor
Avatar
Odpovídá na Juraj Mlich
coells:

Tohle se měnilo ve verzi 2.0, ty používáš 1.2, kde kontruktor Int(String) ještě neexistuje.

 
Odpovědět  +1 17.8.2015 10:11
Avatar
coells
Redaktor
Avatar
Odpovídá na jan.ruzicka01
coells:

OMG, Int je typ závislý na platformě, ne na kompilátoru, na všech Arm6 (a že jich je) to je 32-bitový typ.
Ty vidíš 64-bitovou verzi, protože máš takhle nastavený projekt.
Operátor přetečení tě nezachrání, protože o ten nejde, problém je v kompatibilitě mezi platformami nebo když používáš Objective-C bridging.

 
Odpovědět  +2 17.8.2015 10:32
Avatar
shaman
Člen
Avatar
Odpovídá na jan.ruzicka01
shaman:

Super na male preklepy. tesim sa na dalsi diel.

Odpovědět 18.8.2015 16:50
try {...} catch (Exception ignored) { echo " ¯\_(ツ)_/¯ "; }
Avatar
jan.ruzicka01
Redaktor
Avatar
Odpovídá na shaman
jan.ruzicka01:

To nejsou překlepy, to je "cvičení", ty chyby tam jsou schválně :)

Odpovědět  +1 18.8.2015 17:45
';' je má jediná noční můra...
Avatar
Odpovídá na jan.ruzicka01
Dominik Bucher:

Chtělo by to trošku upgradovat. For cykly, jak jsme byli zvyklý z Cčka jsou od swiftu 2.2 zakázaný a je zde stará/nová syntaxe, kterou jsi popsal jako foreach, když tak se vlastně podle Applu nejmenuje(To je ale rýpání :P) Zapomněl jsi třeba napsat, jak se řeší třeba opačné pořadí číslic, když se chce odpočítávat od 10 třeba do 1 pomocí příkazu stride, taktéž když chceš skákat třeba po 2 k tomu složí stride.

//to a throught zařizují, že se vypíše i poslední index...
for i in 10.stride(to: 0, by 1)
{
print(i)
//10,9,8,7,65,4,3,2,1
}

//Index po 2... se zahrnutím posledního...
for x in 10.stride(throught: 0, by 2)
{
print(x)
//10,8,6,4,2,0
}

K tomuhle bych ještě vypíchl nepřesnost Doublu, ale to je už o programování a datových typech obecně.
Dále je špatně napsaný (U macOS ok) řízení kolikabitový integer je. Řídí se to podle architektury procesoru, třeba na 32 bitovém zařízení se musí explicitně definovat Int64, aby nedošlo k overflow.
Pole pomocí konstruktoru je deklarované sakramentsky složitě, ale to jetvoje věc.

//nechápu, proč tam nemáš
var superStringArray: [tring] = ["První","Druhý","Třetí"]

Spolupráci jsem ti nabízel, nicméně jsi mi napsal, že vaší aplikaci skoro máš a tak. No třeba tě to nakopne a začneš pokračovat v těch tutoriálech, hodně věcí bych i v ostatních článcích upravil... :) Zatím hodně síly a zdaru a ať se daří :)

Editováno 7. srpna 15:00
 
Odpovědět 7. srpna 14:59
Avatar
jan.ruzicka01
Redaktor
Avatar
Odpovídá na Dominik Bucher
jan.ruzicka01:

Neboj, právě dopisuji nový díl, a potom se vrhnu na revizi starých článku :)

Odpovědět 7. srpna 16:14
';' je má jediná noční můra...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 13. Zobrazit vše