Swift (programovací jazyk)
Swift je multi-paradigmatický, kompilovaný, open source programovací jazyk od společnosti Apple, určený pro vývoj na platformách macOS, watchOS a iOS. Je zamýšlen jako alternativa k Objective-C a neměl by dovolit tolik chyb programátora jako Objective-C. Umí spolupracovat s existujícími frameworky Cocoa a Cocoa Touch. Swift je kompilován pomocí LLVM a ve stejném programu může být spolu s kódem v jazycích C, Objective-C a Objective-C++.

Historie 
Vývoj Swiftu započal Chris Lattner roku 2010 a následně se k němu připojili další vývojáři. Mnoho vlastností jazyka bylo převzato z Objective-C, Rust, Haskell, Ruby, Python, C#, CLU a mnoha dalších. 2. června 2014 byl jazyk zveřejněn na WWDC konferenci, spolu s dokumentací dostupnou na vývojářských stránkách Applu a v iBooks Store.

Historie verzí

Vlastnosti 
Swift je z větší části obdobou Objective-C za využití moderních konceptů a syntaxe. Při jeho představení byl jednoduše představen jako „Objective-C bez C“
Swift na rozdíl od Objective-C nevyužívá pointery, v případě potřeby je však možné je využít. Dále byl nahrazen smalltalkový způsob volání metod za tečkovou notaci a jmenné prostory, což je běžné v ostatních C-like jazycích, jako je například Java nebo C#. Swift přináší pojmenované parametry a zachovává klíčové vlastnosti Objective-C, často při zjednodušení syntaxe.

Typy a proměnné 
Cocoa a Cocoa Touch obsahuje mnoho tříd, které byly součástí knihovny Foundation Kit. Patří mezi ně například NSString, pro práci s Unicode řetězci, nebo kolekce NSArray a NSDictionary. Objective-C pomocí syntaktického cukru umožňuje jednoduché vytvoření těchto objektů, ale po jejich vytvoření je nutné s nimi manipulovat pomocí volání objektových metod. Pro příklad následuje spojení dvou NSString objektů:

NSString *str = @"hello,";
str = [str stringByAppendingString:@" world"];

Ve Swiftu je mnoho těchto základních typů přímo v jazyce a může s nimi být i přímo manipulováno. Například řetězce jsou neviditelně mapovány na NSString (když je Foundation importována) a spojení řetězců vypadá následovně:

var str = "hello,"
str += " world"

Foundation Kit obsahuje pro téměř každou třídu dvě její verze, mutable verzi, která může být modifikována za běhu programu, a immutable verzi, která může být po vytvoření pouze čtena. Swift v tomto pokračuje a tuto vlastnost rozšiřuje na všechny typy, primitivní i komplexní. Při deklarování hodnoty se pomocí klíčového slova let určí, že se jedná o immutable konstantu. Mutable proměnné se deklarují pomocí klíčového slova var.

Další důležitou částí jazyka Swift je option typ, který může ale nemusí obsahovat hodnotu. Optionály jsou značeny znakem ? za typem:

var myOptionalString:String? = "Hello"

Tímto je možné dosáhnout podobného chování jako u pointerů v jazyce C, kde pointer může, ale i nemusí obsahovat hodnotu. Toto může být výhodné například v následujících případech:
 Hodnota tu být může i nemusí. Například prostřední jméno u třídy Osoba
 Hledání v kolekci nic nenajde
 Metoda při chybě nevrátí nic
 Pro slabé (weak) vlastnosti ve třídách mohou být nastaveny na nil
 Pro velké prostředky, které mohou být uvolněny pro navrácení paměti.
Výhodou tohoto značení je také to, že programátor hned ví, u které proměnné je nutné provést kontrolu na null pointer.

Swift také podporuje omezení k objektům v následujících třech úrovních: public, internal a private. Na rozdíl od ostatních objektově orientovaných jazyků je ignorována dědičnost. Private naznačuje, že objekt je přístupný jen z jeho zdrojového souboru, „internal“ omezuje přístup na modul a „public“ umožňuje přístup z jakéhokoliv modulu. V jiných jazycích přítomné „protected“ Swift nezná, což se setkalo s jistou kontroverzí.

Knihovny, runtime a vývoj 
Swift využívá stejný runtime pro Objective-C na systémech Mac OS i iOS. To znamená, že programy ve Swiftu mohou být spuštěny na vícero existujících platformách. Důležitějším důsledkem je ale to, že jeden program může být zároveň naprogramován ve Swiftu, Objective-C ale i v C a C++.
Pro zjednodušení vývoje aplikací a znovupoužití stávajícího kódu nabízí Xcode poloautomatický systém, který vytváří a spravuje „přemosťovací hlavičkové soubory“ pro zpřístupnění Objective-C kódu pro Swift. Díky tomuto dokáže Swift používat typy, funkce a proměnné, jako by byly napsané ve Swiftu. Obdobně dokáže Objective-C přistupovat k Swift kódu. Tímto ale nelze použít vlastnosti jazyka Swift, které Objective-C neumí, jako například generické typy nebo identifikátory v Unicode.

Správa paměti 
Swift používá automatické počítání referencí (ARC) pro správu paměti. Jedním z problémů ARC je možné vytvoření strong reference cycle, kde dvě odlišné instance na sebe navzájem odkazují. Swift proto poskytuje klíčová slova weak a unowned, které tomu dokáží zabránit. Vztahy rodič-potomek běžně používají silné reference, zatímco potomek-rodič může použít slabé reference, kde potomci a rodičové mohou být na sobě nezávislí, nebo unowned, kde potomek má vždy rodiče, ale rodič nemusí mít potomka.

Porovnání s Objective-C

Podobné vlastnosti 
 Základní číselné typy (Int, UInt, Float, Double)
 Většina operátorů z C je i ve Swiftu, jsou ale přidány i nové.
 Složené závorky jsou použity pro seskupení příkazů.
 Proměnné jsou přiřazeny pomocí = a porovnány pomocí ==. Nový operátor === ověří, zda se jedná o stejný objekt.
 Hranaté závorky jsou použity u polí pro deklaraci i získání hodnoty pole.
 for, while, if, switch jsou podobné, mají ale rozšířenou funkcionalitu. Například for in iteruje přes kolekci nebo switch s case, které nejsou číslem.
 Třídní metody jsou zděděné, stejně jako metody instancí.

Rozdílné vlastnosti 
 Příkazy nemusí být ukončené středníkem (;), je ho ale možné použít k oddělení více příkazů na jednom řádku
 Hlavičkové soubory nejsou vyžadované
 Typová kontrola
 Type inference
 Generické programování
 Funkce jsou first-class objekty
 Operátory mohou být předefinovány pro třídu a nové operátory mohou být vytvořeny
 Plná podpora Unicode
 Chybí ošetřování výjimek
 Mnoho vlastností jazyků C, ve kterých lze jednoduše udělat chybu, bylo upraveno:
 Ukazatel není v základu přístupný
 Přiřazení nevrací hodnotu. Proto if (i=0) způsobí chybu při kompilaci
 Ve switch bloku není potřebné používat break. Při použití falltrough je zachováno původní chování
 Proměnné a konstanty jsou vždy inicializovány a hranice polí jsou vždy kontrolovány
 Přetečení, které není v C definováno, je zachyceno při běhu programu. Speciální operátory &+, &-, &*, &/ a &% přetečení umožňují.

Ukázka kódu 
// Toto je komentář na jednom řádku

/* toto je komentář
   napsaný na více řádcích */

/* Víceřádkové komentáře
   /* mohou být vnořeny! */
   takže je možné zakomentovat kód, který obsahuje komentáře
*/

// Proměnné ve Swiftu začínají na „var“, následovány jménem, typem a hodnotou
var explicitDouble: Double = 70

// Pokud je typ vynechán, bude použit typ výchozí hodnoty
var implicitInteger = 70
var implicitDouble = 70.0
var 国 = "日本"

// Konstanty jsou definovány pomocí „let“, následovány jménem, typem a hodnotou
let numberOfBananas: Int = 10

//Pokud je typ vynechán, bude použit typ výchozí hodnoty
let numberOfApples = 3
let numberOfOranges = 5

// Hodnoty proměnných mohou být použity v řetězcích následujícím způsobem
let appleSummary = "Mám \(numberOfApples) jablek."
let fruitSummary = "Mám\(numberOfApples + numberOfOranges) kusů ovoce."

// in playgrounds, code can be placed in the global scope
print("Hello, world")

// definice pole
var fruits = ["mango", "kiwi", "avocado"]

// ukázka if podmínky
if fruits.isEmpty {
    print("No fruits in my array.")
} else {
    print("There are \(fruits.count) items in my array")
}

//definice slovníky se jménem a věkem
let people = ["Anna": 67, "Beto": 8, "Jack": 33, "Sam": 25]

// ukázka získání více hodnot v jednom průběhu iterace
for (name, age) in people {
    print("\(name) is \(age) years old.")
}

// funkce a metody jsou definovány pomocí „func“
// návratový typ je definován pomocí ->
func sayHello(personName: String) -> String {
    let greeting = "Ahoj, " + personName + "!"
    return greeting
}

// vytiskne „Ahoj, Jane!“
print(sayHello("Jane"))

// parameter names can be made external and required for calling
// the external name can be the same as the parameter name by
// prefixing with an octothorpe (#)
// or can be defined separately.
func sayAge(#personName: String, personAge Age: Int) -> String {
    let result = "\(personName) is \(Age) years old."
    return result
}

//Je také možné specifikovat jméno parametru
print(sayAge(personName: "Jane", personAge: 42))

Související články 
 Jazyk D
 Objective-C

Externí odkazy

Reference 

Programovací jazyky
Apple
Software pod licencí Apache