Swift (programovací jazyk)

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++.[2]

Swift
Swift
Swift
Paradigma objektově orientovaný, multiparadigmatický, strukturovaný, imperativní
Vznikl v 2014
Autor Chris Lattner, Apple Inc.
Vývojář Apple Inc.
Poslední verze 5.0.0
Typová kontrola silná, statická
Ovlivněn jazyky Objective-C, Haskell, Ruby, Python, jazyk D[1]
OS macOS, iOS, tvOS, watchOS, Linux
Web https://swift.org

HistorieEditovat

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.[3] 2. června 2014 byl jazyk zveřejněn na WWDC konferenci,[4] spolu s dokumentací dostupnou na vývojářských stránkách Applu a v iBooks Store.[5]

Historie verzíEditovat

Datum Verze
9.9.2014 Swift 1.0
22.10.2014 Swift 1.1
8.4.2015 Swift 1.2
21.9.2015 Swift 2.0
13.9.2016 Swift 3.0
19.9.2017 Swift 4.0
29.3.2018 Swift 4.1
17.9.2018 Swift 4.2

VlastnostiEditovat

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“[6][7] Swift na rozdíl od Objective-C nevyužívá pointery, v případě potřeby je však možné je využít.[8] 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éEditovat

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"

[9]

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.[10] 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é 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"

[11]

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

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.[13] V jiných jazycích přítomné „protected“ Swift nezná, což se setkalo s jistou kontroverzí.[14]

Knihovny, runtime a vývojEditovat

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

Správa pamětiEditovat

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-CEditovat

Podobné vlastnostiEditovat

  • 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é vlastnostiEditovat

  • 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óduEditovat

// 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ánkyEditovat

ReferenceEditovat

  1. a b Building assert() in Swift, Part 2: __FILE__ and __LINE__ - Swift Blog - [online]. Apple Developer [cit. 2014-09-26]. Dostupné online. (anglicky) 
  2. TIMMER, John. A fast look at Swift, Apple's new programming language [online]. [cit. 2014-06-06]. A fast look at Swift, Apple’s new programming language Dostupné online. (anglicky) 
  3. LATTNER, Chris. Chris Lattner's Homepage [online]. Chris Lattner, June 3, 2014 [cit. 2014-06-03]. Dostupné online. (anglicky) 
  4. WILLIAMS, Owen. Apple announces Swift, a new programming language for iOS [online]. The Next Web, June 2, 2014 [cit. 2014-06-02]. Dostupné online. (anglicky) 
  5. The Swift Programming Language. [s.l.]: Apple, June 2, 2014. Dostupné online. (anglicky) 
  6. METZ, Rachel. Apple Seeks a Swift Way to Lure More Developers [online]. Technology Review, June 3, 2014. Dostupné online. (anglicky) 
  7. WEBER, Harrison. Apple announces ‘Swift,’ a new programming language for OS X & iOS [online]. VentureBeat, June 2, 2014. Dostupné online. (anglicky) 
  8. Interacting with C APIs [online]. Apple Inc. [cit. 2014-07-15]. Dostupné online. (anglicky) 
  9. Strings and Characters [online]. Apple Inc. [cit. 2014-07-16]. Dostupné online. (anglicky) 
  10. Object mutability [online]. Apple Inc. [cit. 2014-07-16]. Dostupné online. (anglicky) 
  11. Types [online]. Apple Inc. [cit. 2014-07-16]. Dostupné online. (anglicky) 
  12. What is an optional value in Swift? [online]. July 21, 2014 [cit. 2014-07-28]. Dostupné online. (anglicky) 
  13. Access Control [online]. Apple Inc. [cit. 2014-07-22]. Dostupné online. (anglicky) 
  14. No protected access modifier? [online]. July 21, 2014 [cit. 2014-07-28]. Dostupné online. (anglicky) 
  15. "Swift and Objective-C in the Same Project", Apple Inc.