Swift (programovací jazyk) - Swift (programming language)

Rychlý
Logo Swift. Svg
Logo
Paradigma Multi-paradigma : protokolově orientované , objektově orientované , funkční , imperativní , blokově strukturované , deklarativní
Navrhl Chris Lattner , Doug Gregor, John McCall, Ted Kremenek, Joe Groff a Apple Inc.
Vývojář Apple Inc. a přispěvatelé open-source
Poprvé se objevil 2. června 2014 ; před 7 lety ( 2014-06-02 )
Stabilní uvolnění
5.4.2  Upravte to na Wikidata / 28. června 2021 ; před 3 měsíci ( 28. června 2021 )
Náhled vydání
5,5 větev
Kázeň při psaní Statický , silný , odvozený
OS Operační systémy Apple ( Darwin , iOS , iPadOS , macOS , tvOS , watchOS ), Linux , Windows 10 , Android
Licence Licence Apache 2.0 (Swift 2.2 a novější)
Proprietární (až Swift 2.2)
Rozšíření názvu souboru .swift, .SWIFT
webová stránka rychlý .org
Ovlivněn
Objective-C , Rust , Haskell , Ruby , Python , C# , CLU , D
Ovlivněn
Rez

Swift je general-purpose , multi-paradigma , zkompilovaný programovací jazyk vyvinutý společností Apple Inc a open-source komunitě . Swift byl poprvé vydán v roce 2014 a byl vyvinut jako náhrada za dřívější programovací jazyk Apple Objective-C , protože Objective-C se od počátku 80. let 20. století do značné míry nezměnil a postrádal moderní jazykové funkce. Swift pracuje s Apple Cocoa a Cocoa dotykové rámců , a klíčovým aspektem Swiftově návrhu byla schopnost spolupracovat s obrovským tělem stávajícího kódu Objective-C vyvinutý pro produkty Apple v průběhu minulých desetiletí. Je postaven na open source kompilátoru LLVM a je součástí Xcode od verze 6, vydané v roce 2014. Na platformách Apple používá runtime knihovnu Objective-C , která umožňuje kódům C , Objective-C , C ++ a Swift spustit v rámci jednoho programu.

Apple zamýšlel Swift podporovat mnoho klíčových konceptů spojených s Objective-C , zejména dynamické odesílání , rozšířené pozdní vazby , rozšiřitelné programování a podobné funkce, ale „bezpečnějším“ způsobem, který usnadňuje chytání softwarových chyb ; Swift má funkce řešící některé běžné programovací chyby, jako je dereferencování nulového ukazatele a poskytuje syntaktický cukr, který pomáhá vyhnout se pyramidě zkázy . Swift podporuje koncept rozšiřitelnosti protokolu , systém rozšiřitelnosti, který lze aplikovat na typy, struktury a třídy , který Apple prosazuje jako skutečnou změnu v programovacích paradigmatech, která nazývají „programování orientované na protokol“ (podobné vlastnostem ).

Swift byl představen na Apple Worldwide Developers Conference 2014 (WWDC). V roce 2014 prošel upgrade na verzi 1.2 a hlavní upgrade na Swift 2 na WWDC 2015. Původně proprietární jazyk , verze 2.2 byl vytvořen jako open-source software pod licencí Apache License 3. prosince 2015, pro platformy Apple a Linux .

Prostřednictvím verze 3.0 prošla syntaxe Swiftu významnou evolucí, přičemž jádro týmu kladlo důraz na stabilitu zdroje v novějších verzích. V prvním čtvrtletí roku 2018 Swift v měřené popularitě překonal Objective-C .

Swift 4.0, vydaný v roce 2017, představil několik změn v některých integrovaných třídách a strukturách. Kód napsaný v předchozích verzích Swiftu lze aktualizovat pomocí funkce migrace integrované do Xcode. Swift 5, vydaný v březnu 2019, představil stabilní binární rozhraní na platformách Apple, což umožnilo začlenění běhu Swift do operačních systémů Apple. Je kompatibilní se zdrojem Swift 4.

Swift 5.1 byl oficiálně vydán v září 2019. Swift 5.1 navazuje na předchozí verzi Swift 5 rozšířením stabilních funkcí jazyka na dobu kompilace se zavedením stability modulu. Zavedení stability modulu umožňuje vytvářet a sdílet binární rámce, které budou fungovat s budoucími verzemi Swiftu.

Swift 5.5, oficiálně oznámený společností Apple na WWDC 2021 , výrazně rozšiřuje jazykovou podporu pro souběžnost a asynchronní kód , zejména představením jedinečné verze modelu herce .

Dějiny

Vývoj Swiftu zahájil v červenci 2010 Chris Lattner , s případnou spoluprací mnoha dalších programátorů v Apple . Swift vzal jazykové nápady „z Objective-C , Rust , Haskell , Ruby , Python , C# , CLU a příliš mnoho dalších na seznam“. 2. června 2014 se aplikace Apple Worldwide Developers Conference (WWDC) stala první veřejně vydanou aplikací napsanou s aplikací Swift. Beta verze tohoto programovacího jazyka bylo propuštěno k registrovaných vývojářů Apple na konferenci, ale společnost neslíbil, že finální verze Swift bude zdrojový kód kompatibilní s testovací verze. Apple plánoval v případě potřeby pro úplné vydání zpřístupnit převaděče zdrojových kódů.

Swift Programming Language , bezplatný 500stránkový manuál, byl také vydán na WWDC a je k dispozici v Apple Books Store a na oficiálních webových stránkách.

Swift dosáhl milníku 1,0 9. září 2014 s Gold Master of Xcode 6.0 pro iOS . Swift 1.1 byl vydán 22. října 2014 spolu se spuštěním Xcode 6.1. Swift 1.2 byl vydán 8. dubna 2015 spolu s Xcode 6.3. Swift 2.0 byl oznámen na WWDC 2015 a byl k dispozici pro publikování aplikací v App Store 21. září 2015. Swift 3.0 byl vydán 13. září 2016. Swift 4.0 byl vydán 19. září 2017. Swift 4.1 byl vydán dne 29. března 2018.

Společnost Swift získala první místo za nejoblíbenější programovací jazyk v průzkumu vývojářů Stack Overflow Developer 2015 a druhé místo v roce 2016.

Dne 3. prosince 2015 byl jazyk Swift, podporující knihovny, debugger a správce balíčků open source pod licencí Apache 2.0 s Runtime Library Exception, a jako hostitel projektu byl vytvořen Swift.org . Zdrojový kód je hostován na GitHubu , kde je pro každého snadné získat kód, vytvořit jej sám a dokonce vytvořit žádosti o stažení, které přispějí kódem zpět do projektu.

V prosinci 2015 společnost IBM oznámila svůj web Swift Sandbox, který vývojářům umožňuje psát kód Swift do jednoho panelu a zobrazovat výstup v jiném. V lednu 2018 byla zastávka Swift Sandbox zastaralá.

Během WWDC 2016 společnost Apple oznámila exkluzivní aplikaci pro iPad s názvem Swift Playgrounds , která má naučit lidi kódovat ve Swiftu. Tato aplikace je prezentována v rozhraní podobném 3D videohrám, které poskytuje zpětnou vazbu, když jsou řádky kódu umístěny v určitém pořadí a provedeny.

V lednu 2017 Chris Lattner oznámil svůj odchod ze společnosti Apple na novou pozici ve společnosti Tesla Motors , přičemž hlavní roli projektu Swift bude mít veterán týmu Ted Kremenek.

Během WWDC 2019 společnost Apple oznámila SwiftUI s Xcode 11, který poskytuje rámec pro deklarativní návrh struktury uživatelského rozhraní na všech platformách Apple.

Oficiální stahování pro distribuci Ubuntu Linuxu jsou k dispozici od Swiftu 2.2, přičemž další distribuce byly přidány od Swiftu 5.2.4, CentOS a Amazon Linux. Pro Android existuje také neoficiální balíček SDK a nativní balíček nástrojů.

Platformy

Platformy, které Swift podporuje, jsou operační systémy Apple ( Darwin , iOS , iPadOS , macOS , tvOS , watchOS ), Linux , Windows a Android .

Historie verzí

Verze Datum vydání Operační Systém Mac Linux Okna
Swift 1.0 09.09.2014 Ano Ne Ne
Swift 1.1 22. října 2014 Ano Ne Ne
Swift 1.2 08.04.2015 Ano Ne Ne
Swift 2.0 21. září 2015 Ano Ne Ne
Swift 2.1 20. října 2015 Ano Ne Ne
Swift 2.2 21. března 2016 Ano Ano Ne
Swift 2.2.1 3. května 2016 Ano Ano Ne
Swift 3.0 13. září 2016 Ano Ano Ne
Swift 3.0.1 28. října 2016 Ano Ano Ne
Swift 3.0.2 13. prosince 2016 Ano Ano Ne
Swift 3.1 27. března 2017 Ano Ano Ne
Swift 3.1.1 21. dubna 2017 Ano Ano Ne
Swift 4.0 19. září 2017 Ano Ano Ne
Swift 4.0.2 1. listopadu 2017 Ano Ano Ne
Swift 4.0.3 5. prosince 2017 Ano Ano Ne
Swift 4.1 29. března 2018 Ano Ano Ne
Swift 4.1.1 4. května 2018 Ne Ano Ne
Swift 4.1.2 31. května 2018 Ano Ano Ne
Swift 4.1.3 27. července 2018 Ne Ano Ne
Swift 4.2 17. září 2018 Ano Ano Ne
Swift 4.2.1 30. října 2018 Ano Ano Ne
Swift 4.2.2 4. února 2019 Ne Ano Ne
Swift 4.2.3 28. února 2019 Ne Ano Ne
Swift 4.2.4 29. března 2019 Ne Ano Ne
Swift 5.0 25. března 2019 Ano Ano Ne
Swift 5.0.1 18. dubna 2019 Ano Ano Ne
Swift 5.0.2 15. července 2019 Ne Ano Ne
Swift 5.0.3 30. srpna 2019 Ne Ano Ne
Swift 5.1 10. září 2019 Ano Ano Ne
Swift 5.1.1 11. října 2019 Ne Ano Ne
Swift 5.1.2 7. listopadu 2019 Ano Ano Ne
Swift 5.1.3 13. prosince 2019 Ano Ano Ne
Swift 5.1.4 31. ledna 2020 Ne Ano Ne
Swift 5.1.5 9. března 2020 Ne Ano Ne
Swift 5.2 24. března 2020 Ano Ano Ne
Swift 5.2.1 30. března 2020 Ne Ano Ne
Swift 5.2.2 15. dubna 2020 Ano Ano Ne
Swift 5.2.3 29. dubna 2020 Ne Ano Ne
Swift 5.2.4 20. května 2020 Ano Ano Ne
Swift 5.2.5 5. srpna 2020 Ne Ano Ne
Swift 5.3 16. září 2020 Ano Ano Ano
Swift 5.3.1 13. listopadu 2020 Ano Ano Ano
Swift 5.3.2 15. prosince 2020 Ano Ano Ano
Swift 5.3.3 25. ledna 2021 Ne Ano Ano
Swift 5.4 26. dubna 2021 Ano Ano Ano
Swift 5.4.1 25. května 2021 Ne Ano Ano
Swift 5.4.2 28. června 2021 Ano Ano Ano
Swift 5.4.3 9. září 2021 Ne Ano Ano
Swift 5,5 20. září 2021 Ano Ano Ano

Funkce

Swift je alternativou k jazyku Objective-C, který využívá moderní koncepce teorie programovacího jazyka a snaží se představit jednodušší syntaxi. Během svého úvodu byl jednoduše popsán jako „Objective-C bez zavazadel C“.

Ve výchozím nastavení Swift nevystavuje ukazatele a jiné nebezpečné přístupové objekty, na rozdíl od Objective-C, který používá ukazatele všudypřítomně k odkazování na instance objektů. Také Objective-C použití syntaxe podobné Smalltalk pro volání metod bylo nahrazeno tečkovým notačním stylem a systémem jmenného prostoru známějším programátorům z jiných běžných objektově orientovaných (OO) jazyků, jako je Java nebo C# . Swift zavádí skutečné pojmenované parametry a zachovává klíčové koncepty Objective-C, včetně protokolů , uzávěrů a kategorií , často nahrazující dřívější syntaxi čistšími verzemi a umožňující tyto koncepty aplikovat na jiné jazykové struktury, jako jsou výčtové typy (výčty).

Podpora zavírání

Swift podporuje zavírání ( v jiných jazycích známé jako lambdas ). Uzávěry jsou samostatné bloky funkcí, které lze předávat a používat ve vašem kódu. Uzávěry lze považovat za nejmenovanou funkci. Zde je příklad:

// Closure type, defined by its input and output values, can be specified outside the closure:
let closure1: (Int, Int) -> Int = { arg1, arg2 in
    return arg1 + arg2
}

// …or inside it:
let closure2 = { (arg1: Int, arg2: Int) -> Int in
    return arg1 + arg2
}

// In most cases, closure’s return type can be inferred automatically by the compiler.
// However, this functionality may not work for too complex expressions.
let closure3 = { arg1: Int, arg2: Int in
    return arg1 + arg2
}

Swift má koncovou syntaxi uzavření takto:

// This function takes a closure which receives no input parameters and returns an integer,
// evaluates it, and uses the closure’s return value (an Int) as the function’s return value.
func foo(closure bar: () -> Int) -> Int {
    return bar()
}

// Without trailing closure syntax:
foo(closure: { return 1 })

// With trailing closure syntax:
foo { return 1 }

Počínaje verzí 5.3 Swift podporuje více koncových uzávěrů:

// This function passes the return of the first closure as the parameter of the second,
// and returns the second closure’s result:
func foo(bar: () -> Int, baz: (Int) -> Int) -> Int {
    return baz(bar())
}

// With no trailing closures:
foo(bar: { return 1 }, baz: { x in return x + 1 })

// With 1 trailing closure:
a(bar: { return 1 }) { x in return x + 1 })

// With 2 trailing closures (note that only the first closure’s argument name is ommited):
a { return 1 } baz: { x in return x + 1 }

Zde jsou kritéria pro syntaxi koncového uzavření:

  • Pokud jsou posledními argumenty funkce uzávěry, můžete použít syntaxi koncového uzavření.
  • Název parametru prvního koncového uzávěru musí být vynechán.
  • Názvy parametrů zbývajících koncových uzávěrů nesmí být vynechány.
  • Pokud jsou všechny argumenty dané funkci koncové uzávěry, můžete za názvem funkce vynechat závorky.
  • Volání funkce s koncovými uzávěry musí být v závorkách, pokud jsou použity v guardpříkazu.

Podpora strun

V prostředí Cocoa a Cocoa Touch bylo mnoho běžných tříd součástí knihovny Foundation Kit . To zahrnovalo knihovnu řetězců NSString (pomocí Unicode , UTF-8 v Swift 5, změněno z UTF-16 ), třídy sbírek NSArray a NSDictionary a další. Objektiv-C poskytoval různé kousky syntaktického cukru, aby bylo možné některé z těchto objektů vytvářet za běhu v rámci jazyka, ale jakmile byly vytvořeny, s objekty se manipulovalo pomocí volání objektů. Například v Objective-C zřetězení dvou NSStrings požadovaných volání metod podobných tomuto:

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

Ve Swiftu bylo mnoho z těchto základních typů povýšeno na jádro jazyka a lze s nimi přímo manipulovat. Řetězce jsou například neviditelně přemostěny na NSString (při importu Foundation) a nyní je lze spojit s +operátorem, což umožňuje výrazně zjednodušenou syntaxi; předchozím příkladem se stal:

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

Řízení přístupu

Swift podporuje pět řízení přístupu limity pro tyto symboly: open, public, internal, fileprivate, a private. Na rozdíl od mnoha objektově orientovaných jazyků tyto ovládací prvky přístupu ignorují hierarchie dědičnosti : privateoznačuje, že symbol je přístupný pouze v bezprostředním rozsahu , fileprivateindikuje, že je přístupný pouze ze souboru, internaloznačuje, že je přístupný v rámci modulu obsahujícího, publicindikuje, že je přístupný z jakýkoli modul a open(pouze pro třídy a jejich metody) označuje, že třída může být podtřídě mimo modul.

Volitelné doplňky a řetězení

Důležitou novou funkcí v Swiftu jsou typy možností , které umožňují, aby reference nebo hodnoty fungovaly podobným způsobem jako běžný vzor v C , kde ukazatel může odkazovat na hodnotu nebo může být nulový. To znamená, že nevolitelné typy nemohou mít za následek chybu nulového ukazatele ; kompilátor může zajistit, že to není možné.

Volitelné typy se vytvářejí pomocí Optionalmechanismu - k vytvoření Integeru, který je povolen null, by se používalo podobné prohlášení var optionalInteger: Optional<Int>. Stejně jako v jazyce C #, Swift zahrnuje i syntaktický cukr pro to, dovolovat jednoho označují proměnné je volitelná umístěním otazník za názvem typu, var optionalInteger: Int?. Proměnné nebo konstanty, které jsou označeny jako volitelné, mají buď hodnotu základního typu, nebo jsou nil. Volitelné typy zalamují základní typ, což má za následek jinou instanci. Stringa String?jsou zásadně odlišné typy, ten druhý má více společného s Int?než String.

Chcete -li získat přístup k hodnotě uvnitř, za předpokladu, že není nulová, je třeba ji rozbalit, aby se instance odhalila uvnitř. To se provádí s !operátorem:

let myValue = anOptionalInstance!.someMethod()

V tomto případě !operátor rozbalí, anOptionalInstanceaby odhalil instanci uvnitř, což na ní umožní volání metody. Pokud anOptionalInstanceje nula, dojde k chybě nulového ukazatele. To může být v praxi nepříjemné, takže Swift také zahrnuje koncept volitelného řetězení, které otestuje, zda je instance nulová, a poté ji rozbalí, pokud není null:

let myValue = anOptionalInstance?.someMethod()

V tomto případě modul runtime volá someMethodpouze v případě, že anOptionalInstancenení nulový, čímž se chyba potlačí. Normálně to vyžaduje, aby programátor myValuepřed pokračováním otestoval, zda je nulový. Původ pojmu řetězení pochází z běžnějšího případu, kdy je několik metodních volání/getrů zřetězeno dohromady. Například:

let aTenant = aBuilding.tenantList[5]
let theirLease = aTenant.leaseDetails
let leaseStart = theirLease?.startDate

lze snížit na:

let leaseStart = aBuilding.tenantList[5].leaseDetails?.startDate

?Syntax obchází pyramida zkázy .

Swift 2 představil nové klíčové slovo guardpro případy, kdy by se měl kód přestat spouštět, pokud je některá podmínka nesplněna:

guard let leaseStart = aBuilding.TenantList[5]?.leaseDetails?.startDate else
{
    //handle the error case where anything in the chain is nil
    //else scope must exit the current method or loop
}
//continue, knowing that leaseStart is not nil

Používání guardmá tři výhody. Zatímco syntaxe může fungovat jako ifprohlášení, jeho hlavní výhodou je odvození hodnoty, kterou nelze zrušit. Pokud ifprohlášení vyžaduje případ, guardpředpokládá případ na základě poskytnuté podmínky. Protože guardneobsahuje žádný rozsah, s výjimkou elseuzavření, leaseStartje prezentován jako rozbalený volitelný do super-rozsahu stráže. A konečně, pokud guardtest příkazu selže, Swift vyžaduje elseukončení aktuální metody nebo smyčky a zajistí, aby leaseStartnikdy nebyl přístup kdy nil. To se provádí pomocí klíčových slov return, continue, breaknebo throw, nebo na telefonním čísle funkci vracející Never(např fatalError()).

Objektiv C byl slabě napsaný a umožňoval kdykoli volat jakoukoli metodu na jakýkoli objekt. Pokud volání metody selhalo, byl za běhu výchozí obslužný program, který vrátil nulu. To znamenalo, že nebylo potřeba rozbalování ani testování, ekvivalentní prohlášení v Objective-C:

leaseStart = [[[aBuilding tenantList:5] leaseDetails] startDate]

Vrátilo by se nula a to by se dalo vyzkoušet. To však také vyžadovalo, aby všechna volání metod byla dynamická, což přináší značnou režii. Použití doplňků Swift poskytuje podobný mechanismus pro testování a práci s nils, ale dělá to způsobem, který umožňuje kompilátoru použít statické odeslání, protože akce rozbalování je volána na definované instanci (wrapper), oproti tomu, která se vyskytuje při běhu Systém.

Typy hodnot

V mnoha objektově orientovaných jazycích jsou objekty interně zastoupeny ve dvou částech. Objekt je uložen jako blok dat umístěný na haldě , zatímco název (nebo "popisovač") k tomuto objektu je reprezentován ukazatelem . Objekty jsou předávány mezi metodami zkopírováním hodnoty ukazatele, což umožňuje přístup ke stejným podkladovým datům na haldě komukoli s kopií. Naproti tomu základní typy, jako jsou celá čísla a hodnoty s plovoucí desetinnou čárkou, jsou reprezentovány přímo; popisovač obsahuje data, nikoli ukazatel na ně, a tato data se předávají přímo metodám kopírováním. Tyto styly přístupu se v případě objektů nazývají pass-by-reference a pro základní typy pass-by-value .

Oba koncepty mají své výhody i nevýhody. Objekty jsou užitečné, když jsou data velká, například popis okna nebo obsah dokumentu. V těchto případech je přístup k těmto datům zajištěn zkopírováním 32 nebo 64bitové hodnoty oproti kopírování celé datové struktury. Menší hodnoty, jako jsou celá čísla, však mají stejnou velikost jako ukazatele (obvykle jsou obě jedno slovo ), takže předávání ukazatele oproti předávání hodnoty nemá žádnou výhodu. Pass-by-reference také ze své podstaty vyžaduje dereferenční operaci, která může při některých operacích, typicky těch, které se používají s těmito základními hodnotovými typy, jako je matematika, vytvářet znatelnou režii.

Podobně jako C# a na rozdíl od většiny ostatních jazyků OO nabízí Swift integrovanou podporu pro objekty využívající sémantiku pass-by-reference nebo pass-by-value, přičemž první používá classdeklaraci a druhé používá struct. Struktury ve Swiftu mají téměř všechny stejné vlastnosti jako třídy: metody, implementace protokolů a používání mechanismů rozšíření. Z tohoto důvodu Apple označuje všechna data genericky jako instance , versus objekty nebo hodnoty. Struktury však nepodporují dědičnost.

Programátor si může svobodně vybrat, které sémantiky jsou vhodnější pro každou datovou strukturu v aplikaci. Větší struktury, jako jsou okna, by byly definovány jako třídy, což by jim umožnilo předávat je jako ukazatele. Menší struktury, jako 2D bod, lze definovat jako struktury, které budou předávány hodnotou a umožní přímý přístup k jejich interním datům bez dereference. Zlepšení výkonu inherentní konceptu předávání hodnot je takové, že Swift používá tyto typy pro téměř všechny běžné datové typy, včetně Inta Double, a typy normálně reprezentované objekty, jako Stringa Array. Použití typů hodnot může mít za následek také výrazné zlepšení výkonu v uživatelských aplikacích.

Aby se zajistilo, že ani ty největší struktury nezpůsobí při předání výkonnostní pokutu, Swift používá funkci kopírování při zápisu, takže objekty se kopírují pouze tehdy, když se program v nich pokusí změnit hodnotu. To znamená, že různé přístupové objekty mají ve skutečnosti ukazatel na stejné úložiště dat. Takže zatímco data jsou fyzicky uložena jako jedna instance v paměti, na úrovni aplikace jsou tyto hodnoty oddělené a fyzické oddělení je vynuceno kopírováním při zápisu pouze v případě potřeby.

Programování orientované na protokol

Klíčovou vlastností Objective-C je podpora kategorií , metod, které lze přidat za účelem rozšíření tříd za běhu. Kategorie umožňují rozšíření tříd na místě a přidávání nových funkcí bez nutnosti podtřídy nebo dokonce přístupu k původnímu zdrojovému kódu . Příkladem může být přidání podpory kontroly pravopisu do základní NSStringtřídy, což znamená, že všechny instance NSString v aplikaci získají kontrolu pravopisu. Systém je také široce používán jako organizační technika, což umožňuje shromažďování souvisejícího kódu do knihovnových rozšíření. Společnost Swift tento koncept nadále podporuje, přestože se nyní nazývají rozšíření a jsou deklarována pomocí klíčového slova extension. Na rozdíl od Objective-C může Swift k existujícím instancím přidávat také přístupové objekty, typy a výčty nových vlastností.

Další klíčovou vlastností Objective-C je použití protokolů , známých ve většině moderních jazyků jako rozhraní . Protokoly slibují, že konkrétní třída implementuje sadu metod, což znamená, že jiné objekty v systému mohou tyto metody volat na jakýkoli objekt podporující daný protokol. To se často používá v moderních jazycích OO jako náhrada za vícenásobnou dědičnost , i když sady funkcí nejsou zcela podobné. Běžným příkladem protokolu v Cocoa je NSCopyingprotokol, který definuje jednu metodu copyWithZone, která implementuje hloubkové kopírování na objekty.

V Objective-C a většině ostatních jazyků implementujících koncepci protokolu je na programátorovi, aby zajistil implementaci požadovaných metod v každé třídě. Swift přidává možnost přidávat tyto metody pomocí rozšíření a používat k jejich implementaci generické programování (generika). Dohromady tyto protokoly umožňují jednorázové zápisy protokolů a podporují širokou škálu instancí. Mechanismus rozšíření lze také použít k přidání shody protokolu k objektu, který ve své definici tento protokol neuvádí.

Například může být deklarován protokol StringConvertible, který zajišťuje, že instance, které odpovídají protokolu, implementují toStringmetodu, která vrací a String. V Swiftu to lze deklarovat pomocí kódu takto:

protocol StringConvertible
{
    func toString() -> String
}

Tento protokol lze nyní přidat do řetězce, bez přístupu ke zdroji základní třídy:

extension String: StringConvertible
{
    func toString() -> String
    {
        self
    }
}

V aplikaci Swift, jako mnoho moderních jazyků podporujících rozhraní, lze jako typy použít protokoly, což znamená, že proměnné a metody lze definovat protokolem namísto jejich konkrétního typu:

var someSortOfPrintableObject: StringConvertible
...
print(someSortOfPrintableObject.toString())

Nezáleží na tom, jaký druh instance someSortOfPrintableObjectje, kompilátor zajistí, že odpovídá protokolu, a proto je tento kód bezpečný. Tato syntaxe také znamená, že kolekce mohou být také založeny na protokolech, jako let printableArray = [StringConvertible].

Vzhledem k tomu, že Swift považuje struktury a třídy za podobné koncepty, jsou v běhu Swiftu široce využívána jak rozšíření, tak protokoly, aby poskytovaly bohaté API založené na strukturách. Swift například používá rozšíření pro přidání Equatableprotokolu k mnoha jejich základním typům, jako jsou řetězce a pole, což jim umožňuje srovnání s ==operátorem. Konkrétní příklad interakce všech těchto funkcí lze vidět v konceptu implementací výchozích protokolů :

func !=<T : Equatable>(lhs: T, rhs: T) -> Bool

Tato funkce definuje metodu, která funguje na jakékoli instanci, která odpovídá Equatable, a poskytuje funkci , která se nerovná . Jakákoli instance, třída nebo struktura, automaticky získá tuto implementaci jednoduše přizpůsobením Equatable. Jak mnoho instancí získává Equatableprostřednictvím svých základních implementací nebo jiných generických rozšíření, většina základních objektů za běhu se rovná a nerovná se bez kódu.

Tato kombinace protokolů, výchozích hodnot, dědičnosti protokolů a rozšíření umožňuje implementaci mnoha funkcí běžně spojených s třídami a dědičností na typech hodnot. Při správném použití to může vést k dramatickému zlepšení výkonu bez výrazných omezení v API. Tento koncept je v Swiftu tak široce používán, že jej Apple začal nazývat programovacím jazykem orientovaným na protokol . Navrhují řešit mnoho problémových domén běžně řešených prostřednictvím tříd a dědičnosti pomocí protokolů a struktů.

Knihovny, běh a vývoj

V systémech Apple Swift používá stejnou dobu běhu jako existující systém Objective-C , ale vyžaduje iOS 7 nebo macOS 10.9 nebo vyšší. To také závisí na Grand Central Dispatch . Swift a Objective-C kód lze použít v jednom programu a v příponě také C a C ++. Na rozdíl od C nelze kód C ++ použít přímo ze Swiftu. Obálka Objective-C nebo C musí být vytvořena mezi Swift a C ++. V případě Objective-C má Swift značný přístup k objektovému modelu a lze jej použít k podtřídě, rozšíření a použití kódu Objective-C k zajištění podpory protokolu. Konverzace není pravdivá: třídu Swift nelze podřadit do Objective-C.

Aby pomohl vývoji takových programů a opětovnému použití existujícího kódu, Xcode 6 a vyšší nabízí poloautomatický systém, který vytváří a udržuje přemosťovací záhlaví a vystavuje kód Objective-C Swiftu. To má podobu dalšího záhlaví, které jednoduše definuje nebo importuje všechny symboly Objective-C, které jsou potřeba v kódu Swift projektu. V tom okamžiku může Swift odkazovat na typy, funkce a proměnné deklarované v těchto importech, jako by byly napsány ve Swiftu. Kód Objective-C může také přímo používat kód Swift importem automaticky udržovaného hlavičkového souboru s deklaracemi Objective-C symbolů Swift projektu. Například soubor Objective-C ve smíšeném projektu s názvem „MyApp“ mohl s kódem přistupovat ke třídám nebo funkcím Swift #import "MyApp-Swift.h". Prostřednictvím tohoto mechanismu však nejsou k dispozici všechny symboly-použití funkcí specifických pro Swift, jako jsou generické typy, nepovinné typy bez objektů, sofistikované enumy nebo dokonce identifikátory Unicode, může způsobit, že symbol bude z Objective-C nedostupný.

Swift má také omezenou podporu pro atributy , metadata, která jsou čtena vývojovým prostředím, a nemusí být nutně součástí kompilovaného kódu. Stejně jako Objective-C používají atributy @syntaxi, ale aktuálně dostupná sada je malá. Jedním příkladem je @IBOutletatribut, který označuje danou hodnotu v kódu jako výstup , dostupný pro použití v Interface Builder (IB). Výstup je zařízení, které se váže na hodnotu na obrazovce k objektu v kódu.

Na systémech jiných než Apple Swift nezávisí na runtime Objective-C ani na jiných systémových knihovnách Apple; nahrazuje je sada implementací Swift „Corelib“. Patří mezi ně „swift-corelibs-Foundation“, které stojí za Foundation Kit , „swift-corelibs-libdispatch“, které stojí za Grand Central Dispatch, a „swift-corelibs-xctest“ za XCTest API z Xcode .

Od roku 2019, s Xcode 11, Apple také přidal hlavní nové paradigma uživatelského rozhraní s názvem SwiftUI. SwiftUI nahrazuje starší paradigma Interface Builder novým paradigmatem deklarativního vývoje.

Správa paměti

Swift ke správě paměti používá automatické počítání referencí (ARC) . Apple dříve vyžadoval v Objective-C manuální správu paměti, ale ARC představil v roce 2011, aby umožnil snadnější alokaci paměti a uvolňování paměti. Jedním z problémů ARC je možnost vytvoření silného referenčního cyklu , kde se objekty navzájem odkazují způsobem, ze kterého můžete dosáhnout na objekt, ze kterého jste začali, pomocí následujících odkazů (např. Odkazy A B, odkazy B A). To způsobí, že se dostanou do paměti, protože nikdy nebudou uvolněny. Swift poskytuje klíčová slova a zabraňuje silným referenčním cyklům. Vztah rodič-dítě by obvykle používal silný odkaz, zatímco dítě-rodič by používal buď odkaz, kde rodiče a děti mohou být nesouvisející, nebo kde dítě má vždy rodiče, ale rodič nemusí mít dítě. Slabé odkazy musí být volitelné proměnné, protože se mohou změnit a stát se nimi . weakunownedweakunownednil

Uzavření v rámci třídy může také vytvořit silný referenční cyklus zachycením vlastních odkazů. Vlastní odkazy, které mají být považovány za slabé nebo neznámé, lze označit pomocí seznamu zachycení.

Ladění a další prvky

Klíčovým prvkem systému Swift je jeho schopnost čistého odladění a spouštění ve vývojovém prostředí pomocí smyčky REPL ( read -eval -print), což mu dává interaktivní vlastnosti více společné se skriptovacími schopnostmi Pythonu než tradiční programování systému jazyky. REPL je dále vylepšen o hřiště , interaktivní zobrazení běžící v prostředí Xcode, která reagují na změny kódu nebo ladicího programu za běhu. Hřiště umožňují programátorům přidat kód Swift spolu s dokumentací markdown. Pokud se nějaký kód v průběhu času změní nebo s ohledem na jinou vstupní hodnotu na dálku, zobrazení lze použít s pomocníkem časové osy k demonstraci výstupu animovaným způsobem. Kromě toho má Xcode ladicí funkce pro vývoj Swift, včetně zarážek, krokových a krokových příkazů, stejně jako rozdělení umístění prvků uživatelského rozhraní pro vývojáře aplikací.

Apple říká, že Swift je „programovací jazyk průmyslové kvality, který je expresivní a zábavný jako skriptovací jazyk“.

Výkon

Mnoho funkcí představených u Swiftu má dobře známé kompromisy v oblasti výkonu a bezpečnosti. Apple implementoval optimalizace, které snižují tuto režii.

Srovnání s jinými jazyky

Swift je považován za programovací jazyk rodiny C a je C podobný různými způsoby:

  • Většina C operátorů se používá ve Swiftu, ale existuje několik nových operátorů, například pro podporu celočíselných operací s přetečením (viz rozdíly).
  • K seskupení příkazů se používají složené závorky .
  • Proměnné jsou přiřazovány pomocí znaménka rovnosti , ale porovnávány pomocí dvou po sobě jdoucích znamének rovnosti . Je k dispozici nový operátor identity ===, který kontroluje, zda dva datové prvky odkazují na stejný objekt .
  • Řídicí příkazy while, ifa switchjsou podobné, ale mají rozšířené funkce, např. A, switchkteré přebírají celá čísla whilea ifpodporují shodu vzorů a podmíněně rozbalování volitelných doplňků, forpoužívají syntaxi.for i in 1...10
  • S poli se používají hranaté závorky , a to jak k jejich deklaraci, tak k získání hodnoty v daném indexu v jednom z nich.

Má také podobnosti s Objective-C:

  • Základní číselné typy ( Int, UInt, Float, Double)
  • Metody třídy jsou zděděny, jako metody instance; selfv metodách třídy je třída, na kterou byla metoda vyvolána.
  • Podobná for... insyntaxe výčtu.

Rozdíly od Objective-C zahrnují:

  • Příkazy nemusí končit středníky ( ;), ačkoli je třeba je použít k povolení více než jednoho příkazu na řádku.
  • Žádné hlavičkové soubory.
  • Používá odvození typu .
  • Obecné programování .
  • Funkce jsou prvotřídní objekty.
  • Případy výčtu mohou mít přidružená data ( algebraické datové typy ).
  • Operátory lze předefinovat pro třídy ( přetížení operátorem ) a definovat nové operátory.
  • Řetězce plně podporují Unicode . Většinu znaků Unicode lze použít buď v identifikátorech, nebo v operátorech.
  • Žádné zpracování výjimek . Swift 2 představuje jiný a nekompatibilní model pro zpracování chyb.
  • Bylo odstraněno několik funkcí dřívějších jazyků rodiny C, které lze snadno zneužít:
    • Ukazatele nejsou ve výchozím nastavení vystaveny. Není nutné, aby programátor sledoval a označoval názvy pro odkazy nebo dereferencování.
    • Úkoly nevracejí žádnou hodnotu. Tím se zabrání běžné chybě při psaní i = 0namísto i == 0vyvolání chyby při kompilaci.
    • Není nutné používat breakpříkazy v switchblocích. Jednotlivé případy nespadají do dalšího případu, pokud fallthroughnení použito prohlášení.
    • Proměnné a konstanty jsou vždy inicializovány a hranice polí jsou vždy kontrolovány.
    • Přetečení celých čísel , které má za následek nedefinované chování pro celá čísla se znaménkem v jazyce C, jsou v aplikaci Swift chyceny jako chyba běhu. Programátoři si mohou vybrat, aby přetečení pomocí speciálních aritmetické operátory &+, &-, &*, &/a &%. Vlastnosti mina maxjsou definovány v aplikaci Swift pro všechny celočíselné typy a lze je použít k bezpečné kontrole potenciálního přetečení oproti spoléhání se na konstanty definované pro každý typ v externích knihovnách.
    • Forma jednoho příkazu ifa while, která umožňuje vynechání složených závorek kolem příkazu, není podporována.
    • Výčet ve stylu C for (int i = 0; i < c; i++), který je náchylný k chybám off-by-one , není podporován (od Swift 3 dále).
    • Operátory před a po inkrementaci a dekrementaci ( i++, --i...) nejsou podporovány (od Swift 3 dále), tím spíše, že forpříkazy ve stylu C nejsou od Swift 3 dále podporovány.

Vývoj a další implementace

Vzhledem k tomu, že jazyk je open-source, existuje naděje, že bude přenesen na web. Některé webové rámce již byly vyvinuty, jako je IBM ‚s Kitura , Perfect a Vapor .

Společnost Apple také zahájila oficiální pracovní skupinu „Server APIs“, přičemž ústřední roli hrají členové vývojářské komunity Swift.

Druhá svobodná implementace Swift, že cíle Cocoa , Microsoft ‚s Common Language Infrastructure ( .NET ) a Java a Android platformy existuje jako součást prvků kompilátoru z RemObjects Software .

Kombinací nástrojů z LLVM a Macintosh Programmer's Workshop je možné v systému Mac OS 9 spustit velmi malou podmnožinu jazyka .

Viz také

Reference

externí odkazy