Swift (programovací jazyk)

Technology
12 hours ago
8
4
2
Avatar
Author
Albert Flores

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. +more 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í

DatumVerze
9. 9. +more2014Swift 1. 0
22. 10. 2014Swift 1. 1
8. 4. 2015Swift 1. 2
21. 9. 2015Swift 2. 0
13. 9. 2016Swift 3. 0
19. 9. 2017Swift 4. 0
29. 3. 2018Swift 4. 1
17. 9. 2018Swift 4. 2
.

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. +more 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. +more 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í. +more 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í. +more 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. +more 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. +more 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í. +more 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ů. +more * 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. +more 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. +more".

// 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. +more" 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

5 min read
Share this post:
Like it 8

Leave a Comment

Please, enter your name.
Please, provide a valid email address.
Please, enter your comment.
Enjoy this post? Join Cesko.wiki
Don’t forget to share it
Top