Swift (programovací jazyk)

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání
Swift
Swift
Paradigma objektově orientovaný, multiparadigmatický, strukturovaný, imperativní
Vznikl v 2014
Autor Chris Lattner, Apple Inc.
Vývojář Apple Inc.
Poslední verze 3.0
Typová kontrola silná, statická
Ovlivněn jazyky Objective-C, Haskell, Ruby, Python, jazyk D[1]
OS Mac OS X, iOS
Web https://developer.apple.com/swift/

Swift je multi-paradigmatický, kompilovaný, open source programovací jazyk od společnosti Apple určený pro vývoj na platformách Mac OS X 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]

Historie[editovat | editovat zdroj]

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]

Vlastnosti[editovat | editovat zdroj]

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ěné[editovat | editovat zdroj]

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 Foundantion 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ývoj[editovat | editovat zdroj]

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 znovu použ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ěti[editovat | editovat zdroj]

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[editovat | editovat zdroj]

Podobné vlastnosti[editovat | editovat zdroj]

  • 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ěří, zdali 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[editovat | editovat zdroj]

  • 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[editovat | editovat zdroj]

// 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[editovat | editovat zdroj]

Reference[editovat | editovat zdroj]

  1. a b Building assert() in Swift, Part 2: __FILE__ and __LINE__ - Swift Blog - [online]. Apple Developer, [cit. 2014-09-26]. Swift borrows a clever feature from the D language: these identifiers expand to the location of the caller when evaluated in a default argument list.. [1]. (anglicky) 
  2. 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 . (anglicky) 
  3. LATTNER, Chris. Chris Lattner's Homepage [online]. Chris Lattner, June 3, 2014, [cit. 2014-06-03]. I started work on the Swift Programming Language in July of 2010. I implemented much of the basic language structure, with only a few people knowing of its existence. A few other (amazing) people started contributing in earnest late in 2011, and it became a major focus for the Apple Developer Tools group in July 2013 [...] drawing ideas from Objective-C, Rust, Haskell, Ruby, Python, C#, CLU, and far too many others to list.. [2]. (anglicky) 
  4. WILLIAMS, Owen. Apple announces Swift, a new programming language for iOS [online]. The Next Web, June 2, 2014, [cit. 2014-06-02]. [3]. (anglicky) 
  5.  (June 2, 2014) The Swift Programming LanguageApple. Ověřeno k June 2, 2014. 
  6. Apple Seeks a Swift Way to Lure More Developers [online]. Technology Review, June 3, 2014. [4]. (anglicky) 
  7. Apple announces ‘Swift,’ a new programming language for OS X & iOS [online]. VentureBeat, June 2, 2014. [5]. (anglicky) 
  8. Interacting with C APIs [online]. Apple Inc., [cit. 2014-07-15]. [6]. (anglicky) 
  9. Strings and Characters [online]. Apple Inc., [cit. 2014-07-16]. [7]. (anglicky) 
  10. Object mutability [online]. Apple Inc., [cit. 2014-07-16]. [8]. (anglicky) 
  11. Types [online]. Apple Inc., [cit. 2014-07-16]. [9]. (anglicky) 
  12. What is an optional value in Swift? [online]. July 21, 2014, [cit. 2014-07-28]. [10]. (anglicky) 
  13. Access Control [online]. Apple Inc., [cit. 2014-07-22]. [11]. (anglicky) 
  14. No protected access modifier? [online]. July 21, 2014, [cit. 2014-07-28]. [12]. (anglicky) 
  15. "Swift and Objective-C in the Same Project", Apple Inc.