Swift (ohjelmointikieli) - Swift (programming language)

Nopea
Swift logo.svg
Logo
Paradigma Moniparadigma : protokollalähtöinen , olio-suuntautunut , toiminnallinen , pakottava , lohkorakenteinen , deklaratiivinen
Suunnitellut Chris Lattner , Doug Gregor, John McCall, Ted Kremenek, Joe Groff ja Apple Inc.
Kehittäjä Apple Inc. ja avoimen lähdekoodin avustajat
Ensimmäinen ilmestyi 2. kesäkuuta 2014 ; 7 vuotta sitten ( 2014-06-02 )
Vakaa julkaisu
5.4.2  Muokkaa tätä Wikidatassa / 28. kesäkuuta 2021 ; 3 kuukautta sitten ( 28. kesäkuuta 2021 )
Esikatsele julkaisua
5.5 haara
Kirjoituskuri Staattinen , vahva , päätelty
Käyttöjärjestelmä Applen käyttöjärjestelmät ( Darwin , iOS , iPadOS , macOS , tvOS , watchOS ), Linux , Windows 10 , Android
Lisenssi Apache -lisenssi 2.0 (Swift 2.2 ja uudemmat)
Oma (enintään Swift 2.2)
Tiedostotunnisteet .nopea, .SWIFT
Verkkosivusto nopea .org
Vaikuttanut
Objective-C , Ruoste , Haskell , Ruby , Python , C# , CLU , D
Vaikuttanut
Ruoste

Swift on yleiskäyttöinen , moni-paradigma , koottu ohjelmointikieli, jonka on kehittänyt Apple Inc. ja avoimen lähdekoodin yhteisö . Ensimmäisen kerran vuonna 2014 julkaistu Swift kehitettiin Applen aiemman ohjelmointikielen Objective-C korvaajaksi , koska Objective-C oli pysynyt suurelta osin muuttumattomana 1980-luvun alusta lähtien, eikä sillä ollut nykyaikaisia ​​kielitoimintoja. Swift toimii Applen Cocoa ja Cocoa Touch puitteet , ja keskeinen asia Swiftin suunnittelu oli kyky yhteentoimivia valtava kehon nykyisten Objective-C koodia kehitetty Applen tuotteiden kuluneen vuosikymmenen aikana. Se on rakennettu avoimen lähdekoodin llvm kääntäjä puitteet ja se on sisällytetty Xcode sitten version 6, julkaistiin vuonna 2014. Apple-alustoja, se käyttää Objective-C Runtime Library , joka mahdollistaa C , Objective-C , C ++ ja Swift-koodin ajaa yhden ohjelman sisällä.

Apple suunnitteli Swiftin tukevan monia Objective-C: hen liittyviä keskeisiä käsitteitä , erityisesti dynaamista lähettämistä , laajaa myöhäistä sitomista , laajennettavaa ohjelmointia ja vastaavia ominaisuuksia, mutta "turvallisemmalla" tavalla, mikä helpottaa ohjelmistovirheiden havaitsemista ; Swift on ominaisuuksia käsitellään joitakin yhteisiä ohjelmointivirheitä kuten nollaosoittimen dereferencing ja tarjoaa syntaktinen sokeria auttaa välttämään pyramidi doom . Swift tukee protokollan laajennettavuuden käsitettä, laajennettavuusjärjestelmää, jota voidaan soveltaa tyyppeihin, rakenteisiin ja luokkiin ja jota Apple edistää todellisena muutoksena ohjelmointimalleissa, joita ne kutsuvat "protokollalähtöiseksi ohjelmoinniksi" (samanlainen kuin piirteet ).

Swift esiteltiin Applen vuoden 2014 Worldwide Developers Conference (WWDC) -konferenssissa . Se tehtiin päivitystä versioon 1.2 aikana 2014 ja merkittävä päivitys Swift 2 WWDC 2015. Aluksi omaa kieltä , versio 2.2 tehtiin avoimen lähdekoodin ohjelmistojen alla Apache-lisenssi 2.0 3. joulukuuta 2015 Applen alustoille ja Linux .

Version 3.0 kautta Swiftin syntaksi kävi läpi merkittävän kehityksen, ja ydinryhmä teki lähteen vakauden painopisteeksi myöhemmissä versioissa. Vuoden 2018 ensimmäisellä neljänneksellä Swift ylitti mitatun suosionsa Objective-C : n.

Vuonna 2017 julkaistu Swift 4.0 toi useita muutoksia joihinkin sisäänrakennettuihin luokkiin ja rakenteisiin. Swiftin aiempien versioiden kanssa kirjoitettu koodi voidaan päivittää Xcodeen sisäänrakennetulla siirtotoiminnolla. Maaliskuussa 2019 julkaistu Swift 5 toi Applen alustoille vakaan binääriliittymän, jonka avulla Swift -ajon voi sisällyttää Applen käyttöjärjestelmiin. Se on yhteensopiva Swift 4: n kanssa.

Swift 5.1 julkaistiin virallisesti syyskuussa 2019. Swift 5.1 perustuu Swift 5: n edelliseen versioon laajentamalla kielen vakaat ominaisuudet käännösaikaan ottamalla käyttöön moduulin vakaus. Moduulin vakauden käyttöönotto mahdollistaa sellaisten binaarikehysten luomisen ja jakamisen, jotka toimivat Swiftin tulevien julkaisujen kanssa.

Swift 5.5, jonka Apple julkisti virallisesti vuoden 2021 WWDC: ssä , laajentaa merkittävästi rinnakkais- ja asynkronisen koodin kielituettoa ja esittelee erityisesti näyttelijämallin ainutlaatuisen version .

Historia

Chris Lattner aloitti Swiftin kehittämisen heinäkuussa 2010 yhteistyössä monien muiden Applen ohjelmoijien kanssa . Swift otti kieliideoita " Objective-C: ltä , Rustilta , Haskellilta , Rubylta , Pythonilta , C# : lta , CLU: lta ja aivan liian monilta muilta lueteltavilta". 2. kesäkuuta 2014 Applen Worldwide Developers Conference (WWDC) -sovelluksesta tuli ensimmäinen julkisesti julkaistu sovellus, joka on kirjoitettu Swiftin avulla. Beetaversio on ohjelmointikieli oli luovutettu rekisteröity Apple kehittäjien konferenssissa, mutta yhtiö ei luvannut, että lopullinen versio Swift olisi lähdekoodia yhteensopivia testiversio. Apple aikoi asettaa lähdekoodimuuntimet saataville, jos niitä tarvitaan koko julkaisua varten.

Swift-ohjelmointikieli , ilmainen 500-sivuinen opas, julkaistiin myös WWDC: ssä, ja se on saatavana Apple Books Storesta ja viralliselta verkkosivustolta.

Swift saavutti 1,0 virstanpylväs 9. syyskuuta 2014 kanssa Gold Master of Xcode 6.0 iOS . Swift 1.1 julkaistiin 22. lokakuuta 2014 Xcode 6.1: n julkaisun ohella. Swift 1.2 julkaistiin 8. huhtikuuta 2015 yhdessä Xcode 6.3: n kanssa. Swift 2.0 julkistettiin WWDC 2015 -tapahtumassa, ja se julkaistiin sovellusten julkaisemiseksi App Storessa 21. syyskuuta 2015. Swift 3.0 julkaistiin 13. syyskuuta 2016. Swift 4.0 julkaistiin 19. syyskuuta 2017. Swift 4.1 julkaistiin 29. maaliskuuta 2018.

Swift voitti ensimmäisen paikka eniten rakasti ohjelmointikieli on pinon ylivuodon Developer Survey 2015 ja toiseksi vuonna 2016.

3. joulukuuta 2015 Swift-kieli, kirjastoja tukeva, virheenkorjaaja ja paketinhallinta olivat avoimen lähdekoodin Apache 2.0 -lisenssin alaisia ​​ja Runtime Library Exception, ja Swift.org luotiin isännöimään projektia. Lähdekoodia isännöidään GitHubissa , missä kuka tahansa voi helposti hankkia koodin, rakentaa sen itse ja jopa luoda vetopyyntöjä koodin palauttamiseksi projektiin.

Joulukuussa 2015 IBM julkisti Swift Sandbox -verkkosivustonsa, jonka avulla kehittäjät voivat kirjoittaa Swift -koodin yhteen ruutuun ja näyttää tuloksen toisessa. Swift Sandbox poistettiin käytöstä tammikuussa 2018.

Aikana WWDC 2016 , Apple julkisti iPad yksinomainen sovellus , nimeltään Swift leikkikentät , joiden tarkoituksena on opettaa ihmisille, miten koodia Swift. Sovellus esitetään 3D-videopelimaisessa käyttöliittymässä, joka antaa palautetta, kun koodirivit asetetaan tiettyyn järjestykseen ja suoritetaan.

Tammikuussa 2017 Chris Lattner ilmoitti lähtevänsä Applelta uuteen tehtävään Tesla Motorsissa , ja Swift -projektin päärooli siirtyi joukkueen veteraanille Ted Kremenekille.

WWDC 2019: n aikana Apple julkisti SwiftUI: n Xcode 11: n kanssa, joka tarjoaa puitteet deklaratiiviselle käyttöliittymärakenteen suunnittelulle kaikilla Apple -alustoilla.

Viralliset lataukset Ubuntun Linux -jakelulle ovat olleet saatavilla Swift 2.2: n jälkeen, ja lisää distroja on lisätty Swift 5.2.4: n, CentOS: n ja Amazon Linuxin jälkeen. Androidille on myös epävirallinen SDK ja alkuperäinen työkalupaketti.

Alustat

Swift -tukialustat ovat Applen käyttöjärjestelmät ( Darwin , iOS , iPadOS , macOS , tvOS , watchOS ), Linux , Windows ja Android .

Versiohistoria

Versio Julkaisupäivä Mac käyttöjärjestelmä Linux Windows
Swift 1.0 9. syyskuuta 2014 Joo Ei Ei
Nopea 1.1 22. lokakuuta 2014 Joo Ei Ei
Nopea 1.2 8. huhtikuuta 2015 Joo Ei Ei
Swift 2.0 21. syyskuuta 2015 Joo Ei Ei
Nopea 2.1 20. lokakuuta 2015 Joo Ei Ei
Nopea 2.2 21. maaliskuuta 2016 Joo Joo Ei
Nopea 2.2.1 3. toukokuuta 2016 Joo Joo Ei
Swift 3.0 13. syyskuuta 2016 Joo Joo Ei
Swift 3.0.1 28. lokakuuta 2016 Joo Joo Ei
Swift 3.0.2 13. joulukuuta 2016 Joo Joo Ei
Nopea 3.1 27. maaliskuuta 2017 Joo Joo Ei
Nopea 3.1.1 21. huhtikuuta 2017 Joo Joo Ei
Swift 4.0 19. syyskuuta 2017 Joo Joo Ei
Swift 4.0.2 1. marraskuuta 2017 Joo Joo Ei
Swift 4.0.3 5. joulukuuta 2017 Joo Joo Ei
Nopea 4.1 29. maaliskuuta 2018 Joo Joo Ei
Nopea 4.1.1 4. toukokuuta 2018 Ei Joo Ei
Nopea 4.1.2 31. toukokuuta 2018 Joo Joo Ei
Nopea 4.1.3 27. heinäkuuta 2018 Ei Joo Ei
Nopea 4.2 17. syyskuuta 2018 Joo Joo Ei
Nopea 4.2.1 30. lokakuuta 2018 Joo Joo Ei
Nopea 4.2.2 4. helmikuuta 2019 Ei Joo Ei
Nopea 4.2.3 28. helmikuuta 2019 Ei Joo Ei
Nopea 4.2.4 29. maaliskuuta 2019 Ei Joo Ei
Swift 5.0 25. maaliskuuta 2019 Joo Joo Ei
Swift 5.0.1 18. huhtikuuta 2019 Joo Joo Ei
Swift 5.0.2 15. heinäkuuta 2019 Ei Joo Ei
Swift 5.0.3 30. elokuuta 2019 Ei Joo Ei
Swift 5.1 10. syyskuuta 2019 Joo Joo Ei
Nopea 5.1.1 11. lokakuuta 2019 Ei Joo Ei
Nopea 5.1.2 7. marraskuuta 2019 Joo Joo Ei
Nopea 5.1.3 13. joulukuuta 2019 Joo Joo Ei
Nopea 5.1.4 31. tammikuuta 2020 Ei Joo Ei
Nopea 5.1.5 9. maaliskuuta 2020 Ei Joo Ei
Nopea 5.2 24. maaliskuuta 2020 Joo Joo Ei
Nopea 5.2.1 30. maaliskuuta 2020 Ei Joo Ei
Nopea 5.2.2 15. huhtikuuta 2020 Joo Joo Ei
Nopea 5.2.3 29. huhtikuuta 2020 Ei Joo Ei
Nopea 5.2.4 20. toukokuuta 2020 Joo Joo Ei
Nopea 5.2.5 5. elokuuta 2020 Ei Joo Ei
Nopea 5.3 16. syyskuuta 2020 Joo Joo Joo
Nopea 5.3.1 13. marraskuuta 2020 Joo Joo Joo
Nopea 5.3.2 15. joulukuuta 2020 Joo Joo Joo
Nopea 5.3.3 25. tammikuuta 2021 Ei Joo Joo
Nopea 5.4 26. huhtikuuta 2021 Joo Joo Joo
Nopea 5.4.1 25. toukokuuta 2021 Ei Joo Joo
Nopea 5.4.2 28. kesäkuuta 2021 Joo Joo Joo
Nopea 5.4.3 9. syyskuuta 2021 Ei Joo Joo
Nopea 5.5 20. syyskuuta 2021 Joo Joo Joo

ominaisuudet

Swift on vaihtoehto Objective-C- kielelle, joka käyttää nykyaikaisia ​​ohjelmointikielen teoriakonsepteja ja pyrkii esittämään yksinkertaisemman syntaksin. Esittelyn aikana sitä kuvattiin yksinkertaisesti nimellä "Objective-C ilman C: n matkatavaroita".

Oletuksena Swift ei paljasta osoittimia ja muita vaarallisia apuohjelmia , toisin kuin Objective-C, joka käyttää osoittimia yleisesti viittaamaan objekti-ilmentymiin. Myös Objective-C: n käyttämä Smalltalk- kaltainen syntaksi menetelmäpuhelujen soittamiseen on korvattu piste-merkinnän tyylillä ja nimitilajärjestelmällä, joka on tutumpi ohjelmoijille muilta yleisiltä objektipohjaisilta (OO) kieliltä, ​​kuten Java tai C# . Swift ottaa käyttöön todellisia nimettyjä parametreja ja säilyttää tärkeät Objective-C-käsitteet, mukaan lukien protokollat , sulkemiset ja luokat , usein korvaamalla aiemman syntaksin puhtaammilla versioilla ja sallimalla näiden käsitteiden soveltamisen muihin kielirakenteisiin , kuten lueteltuihin tyyppeihin (enum).

Sulkemisen tuki

Swift tukee sulkemisia (tunnetaan muilla kielillä lambdina ). Sulkimet ovat itsenäisiä toimintolohkoja, joita voidaan siirtää ja käyttää koodissasi. Sulkemisia voidaan ajatella nimettöminä funktioina. Tässä on esimerkki:

// 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
}

Swiftillä on seuraavanlainen sulkemissyntaksi:

// 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 }

Versiosta 5.3 alkaen Swift tukee useita perän sulkemisia:

// 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 }

Tässä on kriteerit perän sulkemisen syntaksille:

  • Jos funktion viimeiset argumentit ovat sulkemisia, voit käyttää loppusulkemisen syntaksia.
  • Ensimmäisen perään sulkemisen parametrin nimi on jätettävä pois.
  • Jäljellä olevien sulkujen parametrien nimiä ei saa jättää pois.
  • Jos kaikki funktiolle annetut argumentit ovat sulkeutumisia, voit jättää sulut pois toiminnon nimen jälkeen.
  • Kutsut toimintoon, jossa on sulkeminen, on suljettava suluissa, jos niitä käytetään guardlausekkeessa.

Jousituki

Alle Kaakao ja Cocoa Touch ympäristöissä monia yhteisiä luokat olivat osa säätiön Kit kirjastoon. Tähän sisältyi NSString-merkkijonokirjasto (käyttäen Unicodea , UTF-8 Swift 5: ssä, muutettu UTF-16: sta ), NSArray- ja NSDictionary-kokoelmaluokat ja muut. Objective-C tarjosi useita syntaktisen sokerin bittejä, jotta jotkut näistä objekteista voidaan luoda lennossa kielellä, mutta kun ne on luotu, objekteja manipuloidaan objektikutsuilla. Esimerkiksi Objective-C: ssä kahden NSS-merkkijonon pakollisen menetelmän kutsut, jotka ovat samankaltaisia ​​kuin tämä:

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

Swiftissä monet näistä perustyypeistä on ylennetty kielen ytimeen, ja niitä voidaan manipuloida suoraan. Esimerkiksi merkkijonot on näkymättömästi yhdistetty NSStringiin (kun Foundation tuodaan), ja ne voidaan nyt yhdistää +operaattoriin, mikä mahdollistaa huomattavasti yksinkertaisemman syntaksin; edellisestä esimerkistä tuli:

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

Kulunvalvonta

Swift tukee viittä kulunvalvonta tasot symboleja: open, public, internal, fileprivate, ja private. Toisin kuin monet olio-suuntautuneet kielet, nämä käyttöoikeudet ohittavat perintöhierarkiat : privateosoittaa, että symboli on käytettävissä vain välittömässä laajuudessa , fileprivateosoittaa, että se on käytettävissä vain tiedoston sisältä, internalosoittaa, että se on käytettävissä sisältävän moduulin sisällä, publicosoittaa, että se on käytettävissä osoitteesta mikä tahansa moduuli, ja open(vain luokille ja niiden menetelmille) osoittaa, että luokka voidaan luokitella moduulin ulkopuolelle.

Lisävarusteet ja ketjutus

Tärkeä uusi ominaisuus Swiftissä on vaihtoehtotyypit , joiden avulla viittaukset tai arvot voivat toimia samalla tavalla kuin C: n yleinen kuvio , jossa osoitin voi viitata arvoon tai olla tyhjä. Tämä tarkoittaa, että ei-valinnaiset tyypit eivät voi johtaa nollaosoittimen virheeseen ; kääntäjä voi varmistaa, että tämä ei ole mahdollista.

Valinnaisia ​​tyyppejä luodaan Optionalmekanismin avulla - nollattavan kokonaisluvun tekemiseksi käytetään samanlaista ilmoitusta var optionalInteger: Optional<Int>. Kuten C #, Swift myös syntaktista sokerin tämä, jolloin toinen ilmaisee muuttuja on valinnainen laittamalla kysymysmerkki jälkeen tyypin nimi, var optionalInteger: Int?. Muuttujilla tai vakioilla, jotka on merkitty valinnaisiksi, on joko taustalla olevan tyypin arvo tai ne ovat nil. Valinnaiset tyypit käärivät perustyypin, jolloin tuloksena on eri esiintymä. Stringja String?ovat pohjimmiltaan erilaisia ​​tyyppejä, jälkimmäisellä on enemmän yhteistä Int?kuin String.

Jos haluat käyttää sisällä olevaa arvoa, olettaen, että se ei ole nolla, se on purettava, jotta ilmentymä näkyy sisällä. Tämä suoritetaan !operaattorin kanssa:

let myValue = anOptionalInstance!.someMethod()

Tässä tapauksessa !operaattori purkaa pakkauksensa anOptionalInstancepaljastaakseen ilmentymän sisällä, jolloin menetelmäkutsu voidaan tehdä sille. Jos arvo anOptionalInstanceon nolla, tapahtuu nollaosoittimen virhe. Tämä voi olla ärsyttävää käytännössä, joten Swift sisältää myös valinnaisen ketjutuksen käsitteen testatakseen, onko ilmentymä nolla, ja purkaa se sitten, jos se ei ole nolla:

let myValue = anOptionalInstance?.someMethod()

Tässä tapauksessa ajonaikaiset puhelut someMethodvain, jos se anOptionalInstanceei ole nolla, tukahduttaa virheen. Normaalisti tämä vaatii ohjelmoijan testaamaan onko myValuenolla ennen jatkamista. Termin ketjutus alkuperä tulee yleisemmästä tapauksesta, jossa useat menetelmäkutsut/getterit on ketjutettu yhteen. Esimerkiksi:

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

voidaan pienentää:

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

?Syntaksin kiertää pyramidi doom .

Swift 2 esitteli uuden avainsanan guardtapauksissa, joissa koodin pitäisi lakata suorittamasta, jos jokin ehto ei täyty:

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

Käyttämisestä guardon kolme hyötyä. Vaikka syntaksi voi toimia iflausekkeena, sen ensisijainen etu on päätellä ei-nollability. Jos iflausunto edellyttää tapausta, guardoletetaan tapaus annetun ehdon perusteella. Lisäksi koska se guardei sisällä ulottuvuutta, lukuun ottamatta elsesulkemista, leaseStartse esitetään käärimättömänä valinnaisena vartijan superskaapeleille. Lopuksi, jos guardkäskyn testi epäonnistuu, Swift vaatii elsepoistumaan nykyisestä menetelmästä tai silmukasta varmistaen, leaseStartettei milloinkaan päästä milloin tahansa nil. Tämä tehdään avainsanoja return, continue, breaktai throw, tai soittamalla palauttavan toiminnon Never(esim fatalError()).

Objective-C oli heikosti kirjoitettu ja salli minkä tahansa menetelmän kutsumisen mihin tahansa kohteeseen milloin tahansa. Jos menetelmäpuhelu epäonnistui, ajon aikana oli oletuskäsittelijä, joka palautti nollan. Tämä tarkoitti sitä, että pakkauksen purkamista tai testaamista ei tarvittu, vastaava lauseke Objective-C:

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

Palauttaisi nollan, ja tämä voitaisiin testata. Tämä edellytti kuitenkin myös sitä, että kaikki menetelmäkutsut ovat dynaamisia, mikä aiheuttaa merkittäviä yleiskustannuksia. Swiftin lisävarusteiden käyttö tarjoaa samanlaisen mekanismin nilien testaamiseen ja käsittelyyn, mutta tekee sen tavalla, joka sallii kääntäjän käyttää staattista lähettämistä, koska pakkauksen purkutoiminto kutsutaan määritetylle esiintymälle (kääre) verrattuna ajonaikaiseen lähetykseen järjestelmä.

Arvotyypit

Monilla objektiorientoiduilla kielillä objektit esitetään sisäisesti kahdessa osassa. Objekti tallennetaan kasaan sijoitettuna tietolohkona , kun taas kohteen nimi (tai "kahva") on osoitin . Objektit välitetään menetelmien välillä kopioimalla osoittimen arvo, jolloin kaikki, joilla on kopio, voivat käyttää samoja kasan taustalla olevia tietoja. Sitä vastoin perustyypit, kuten kokonaisluvut ja liukulukuarvot, esitetään suoraan; kahva sisältää tiedot, ei osoittimen siihen, ja että tiedot välitetään suoraan menetelmiin kopioimalla. Nämä tyylit pääsyn kutsutaan syöttö-by-reference tapauksessa esineitä, ja pass-by-arvo on perustyyppiä.

Molemmilla käsitteillä on etunsa ja haittansa. Objektit ovat hyödyllisiä, kun tiedot ovat suuria, kuten ikkunan kuvaus tai asiakirjan sisältö. Näissä tapauksissa pääsy kyseisiin tietoihin tarjotaan kopioimalla 32- tai 64-bittinen arvo verrattuna koko tietorakenteen kopiointiin. Pienemmät arvot, kuten kokonaisluvut, ovat kuitenkin samankokoisia kuin osoittimet (tyypillisesti molemmat ovat yksi sana ), joten osoittimen siirtämisestä ei ole hyötyä verrattuna arvon välittämiseen. Myös ohitusviittaus edellyttää luontaisesti dereferenssitoimintoa, joka voi aiheuttaa huomattavia yleiskustannuksia joissakin toiminnoissa, tyypillisesti näissä perusarvotyypeissä, kuten matematiikassa.

Samoin kuin C# ja toisin kuin useimmat muut OO-kielet, Swift tarjoaa sisäänrakennetun tuen objekteille, jotka käyttävät joko ohitusviittausta tai ohitusarvo-semantiikkaa, joista ensimmäinen käyttää classilmoitusta ja jälkimmäinen struct. Swiftin rakenteilla on lähes kaikki samat ominaisuudet kuin luokilla: menetelmät, protokollien toteutus ja laajennusmekanismien käyttö. Tästä syystä Apple pitää kaikkia tietoja yleisesti esiintyminä , objekteina tai arvoina. Rakenteet eivät kuitenkaan tue perintöä.

Ohjelmoija voi vapaasti valita, mikä semantiikka on sopivampi kullekin sovelluksen tietorakenteelle. Suuremmat rakenteet, kuten ikkunat, määritellään luokiksi, jolloin ne voidaan siirtää osoittimina. Pienemmät rakenteet, kuten 2D-piste, voidaan määritellä rakenteiksi, jotka ovat ohitusarvoja ja mahdollistavat suoran pääsyn sisäisiin tietoihinsa ilman poikkeuksia. Ohitusarvon käsitteeseen sisältyvä suorituskyvyn parannus on sellainen, että Swift käyttää näitä tyyppejä lähes kaikkiin yleisiin tietotyyppeihin, mukaan lukien Intja Doubleja tyypit, joita tavallisesti edustavat objektit, kuten Stringja Array. Arvotyyppien käyttö voi parantaa merkittävästi suorituskykyä myös käyttäjäsovelluksissa.

Varmistaakseen, että suurimmatkin rakenteet eivät aiheuta suorituskykyrangaistusta, kun ne luovutetaan, Swift käyttää kopio kirjoittamalla -toimintoa, jotta objektit kopioidaan vain, jos ja kun ohjelma yrittää muuttaa niiden arvoa. Tämä tarkoittaa sitä, että erilaisilla lisälaitteilla on käytännössä osoitin samaan tietovarastoon. Joten vaikka tiedot tallennetaan fyysisesti muistiin yhdeksi ilmentymäksi, sovelluksen tasolla nämä arvot ovat erillisiä ja fyysinen erottaminen pakotetaan kopioimalla kirjoituksella vain tarvittaessa.

Protokollalähtöinen ohjelmointi

Objective-C: n keskeinen piirre on sen tuki luokille , menetelmille, jotka voidaan lisätä luokkien laajentamiseen ajon aikana. Luokkien avulla luokkien laajentaminen paikan päällä voi lisätä uusia toimintoja ilman aliluokkaa tai edes pääsyä alkuperäiseen lähdekoodiin . Esimerkki voisi olla oikeinkirjoituksen tarkistuksen tuen lisääminen NSStringperusluokkaan, mikä tarkoittaa kaikkia NSString -esiintymiä sovelluksen vahvistuksen oikeinkirjoituksen tarkistuksessa. Järjestelmää käytetään myös laajalti organisointitekniikkana, jolloin siihen liittyvä koodi voidaan kerätä kirjastokokoisiin laajennuksiin. Swift tukee edelleen tätä käsitettä, vaikka niitä kutsutaan nykyään laajennuksiksi , ja ne on ilmoitettu avainsanalla extension. Toisin kuin Objective-C, Swift voi myös lisätä uusia ominaisuuksien lisäosia, tyyppejä ja enumeja olemassa oleviin esiintymiin.

Toinen Objective-C: n keskeinen piirre on protokollien käyttö , joka tunnetaan useimmilla nykyaikaisilla kielillä rajapintoina . Protokollat ​​lupaavat, että tietty luokka toteuttaa joukon menetelmiä, mikä tarkoittaa, että muut järjestelmän objektit voivat kutsua nämä menetelmät mille tahansa protokollaa tukevalle objektille. Tätä käytetään usein nykyaikaisissa OO -kielissä usean perinnön korvikkeena , vaikka ominaisuusjoukot eivät ole täysin samanlaisia. Yleinen esimerkki protokollasta kaakaossa on NSCopyingprotokolla, joka määrittelee yhden menetelmän copyWithZone, jolla toteutetaan syvä kopiointi kohteisiin.

Objective-C: ssä ja useimmissa muissa protokollakonseptia toteuttavissa kielissä ohjelmoijan on huolehdittava siitä, että vaaditut menetelmät toteutetaan jokaisessa luokassa. Swift lisää mahdollisuuden lisätä nämä menetelmät laajennusten avulla ja käyttää yleistä ohjelmointia (geneerisiä) niiden toteuttamiseen. Yhdessä nämä mahdollistavat protokollien kirjoittamisen kerran ja tukevat monenlaisia ​​tapauksia. Laajennusmekanismia voidaan käyttää myös protokollan yhteensopivuuden lisäämiseen objektiin, joka ei luettele kyseistä protokollaa määritelmässään.

Esimerkiksi protokolla voidaan julistaa kutsutuksi StringConvertible, mikä varmistaa, että protokollan mukaiset esiintymät toteuttavat toStringmenetelmän, joka palauttaa a String. Swiftissä tämä voidaan ilmoittaa seuraavalla koodilla:

protocol StringConvertible
{
    func toString() -> String
}

Tämä protokolla voidaan nyt lisätä merkkijonoon ilman pääsyä perusluokan lähteeseen:

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

Swiftissä, kuten monet nykyaikaiset käyttöliittymiä tukevat kielet, protokollia voidaan käyttää tyypeinä, mikä tarkoittaa, että muuttujat ja menetelmät voidaan määrittää protokollalla niiden erityistyypin sijasta:

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

Ei ole väliä, millainen ilmentymä someSortOfPrintableObjecton, kääntäjä varmistaa, että se on protokollan mukainen ja siten tämä koodi on turvallinen. Tämä syntaksi tarkoittaa myös sitä, että kokoelmat voivat perustua myös protokolliin, kuten let printableArray = [StringConvertible].

Koska Swift pitää rakenteita ja luokkia samankaltaisina konsepteina, sekä laajennuksia että protokollia käytetään laajalti Swiftin ajon aikana, jotta ne tarjoavat rikkaan, rakenteisiin perustuvan sovellusliittymän. Esimerkiksi Swift käyttää laajennusta lisätäkseen Equatableprotokollan moniin niiden perustyyppeihin, kuten merkkijonot ja taulukot, jolloin niitä voidaan verrata ==operaattoriin. Konkreettinen esimerkki siitä, kuinka kaikki nämä ominaisuudet ovat vuorovaikutuksessa, näkyy oletusprotokollatoteutusten käsitteessä :

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

Tämä funktio määrittää menetelmän, joka toimii missä tahansa yhteensopivassa ilmentymässä Equatableja tarjoaa funktion , joka ei ole sama . Mikä tahansa esiintymä, luokka tai rakenne, saa automaattisesti tämän toteutuksen yksinkertaisesti noudattamalla Equatable. Koska monet esiintymät hyötyvät Equatableperuskäyttöönotostaan ​​tai muista yleisistä laajennuksistaan, useimmat ajonaikaisen vahvistuksen perusobjektit ovat yhtä suuret eivätkä yhtä kuin ilman koodia.

Tämä protokollien, oletusasetusten, protokollien perinnän ja laajennusten yhdistelmä mahdollistaa useiden luokkiin ja perintöön normaalisti liittyvien toimintojen toteuttamisen arvotyypeissä. Oikein käytettynä tämä voi johtaa dramaattisiin suorituskyvyn parannuksiin ilman merkittäviä rajoituksia sovellusliittymässä. Tätä käsitettä käytetään niin laajalti Swiftissä, että Apple on alkanut kutsua sitä protokollalähtöiseksi ohjelmointikieleksi . He ehdottavat, että käsitellään monia ongelma -alueita, jotka yleensä ratkaistaan ​​luokkien ja perinnön avulla käyttämällä protokollia ja rakenteita.

Kirjastot, käyttöaika ja kehitys

Apple-järjestelmissä Swift käyttää samaa suoritusaikaa kuin nykyinen Objective-C- järjestelmä, mutta vaatii iOS 7: n tai macOS 10.9: n tai uudemman. Se riippuu myös Grand Central Dispatchista . Swift- ja Objective-C-koodia voidaan käyttää yhdessä ohjelmassa ja laajennuksella myös C ja C ++. Toisin kuin C, C ++ -koodia ei voi käyttää suoraan Swiftistä. Swiftin ja C ++: n väliin on luotava Objective-C- tai C-kääre. Objective-C: n tapauksessa Swiftillä on huomattava pääsy objektimalliin, ja sitä voidaan käyttää Objective-C-koodin alaluokitteluun, laajentamiseen ja käyttämiseen protokollatuen tarjoamiseksi. Päinvastoin ei pidä paikkaansa: Swift-luokkaa ei voi luokitella Objective-C: hen.

Tällaisten ohjelmien kehittämisen ja olemassa olevan koodin uudelleenkäytön helpottamiseksi Xcode 6 ja uudemmat tarjoavat puoliautomaattisen järjestelmän, joka rakentaa ja ylläpitää siltaotsikkoa paljastaakseen Swiftille Objective-C-koodin. Tämä on ylätunnistetiedosto, joka yksinkertaisesti määrittää tai tuo kaikki Objective-C-symbolit, joita projektin Swift-koodi tarvitsee. Siinä vaiheessa Swift voi viitata tuonnissa ilmoitettuihin tyyppeihin, toimintoihin ja muuttujiin ikään kuin ne olisi kirjoitettu Swift -kielellä. Objective-C-koodi voi myös käyttää Swift-koodia suoraan tuomalla automaattisesti ylläpidetyn otsikkotiedoston, joka sisältää Objective-C-ilmoitukset projektin Swift-symboleista. Esimerkiksi Objective-C-tiedosto sekamuotoisessa projektissa nimeltä "MyApp" voisi käyttää Swift-luokkia tai -toimintoja koodilla #import "MyApp-Swift.h". Kaikki symbolit eivät kuitenkaan ole käytettävissä tämän mekanismin kautta-Swift-erityisominaisuuksien, kuten yleisten tyyppien, muiden kuin objektien valinnaisten tyyppien, kehittyneiden enumien tai jopa Unicode-tunnisteiden käyttö voi tehdä symbolista tavoittamattoman Objective-C: stä.

Swiftillä on myös rajoitettu tuki määritteille , kehitysympäristön lukemille metatiedoille, eikä se välttämättä ole osa koottua koodia. Kuten Objective-C, määritteet käyttävät @syntaksia, mutta tällä hetkellä saatavilla oleva joukko on pieni. Yksi esimerkki on @IBOutletattribuutti, joka merkitsee koodissa annetun arvon pistorasiaksi , joka on käytettävissä Interface Builderissa (IB). Pistorasia on laite, joka sitoo arvo näytön näytön esineen koodin.

Muissa kuin Apple-järjestelmissä Swift ei ole riippuvainen Objective-C-suoritusajasta tai muista Applen järjestelmäkirjastoista. joukko Swift -Corelib -toteutuksia korvaa ne. Näitä ovat "swift-corelibs-säätiö" säätiöpakettia varten , "swift-corelibs-libdispatch" seisomaan Grand Central Dispatchissa ja "swift-corelibs-xctest" XCTestia varten Xcoden sovellusliittymät .

Vuodesta 2019 lähtien Apple on lisännyt Xcode 11: n myötä uuden suuren käyttöliittymämallin nimeltä SwiftUI. SwiftUI korvaa vanhan Interface Builder -mallin uudella deklaratiivisella kehitysmallilla.

Muistin hallinta

Swift käyttää automaattista viitelaskentaa (ARC) muistin hallintaan . Apple vaati aiemmin manuaalista muistinhallintaa Objective-C: ssä, mutta esitteli ARC: n vuonna 2011 helpottaakseen muistin jakamista ja käsittelemistä. Yksi ARC: n ongelma on mahdollisuus luoda vahva viitesykli , jossa objektit viittaavat toisiinsa tavalla, jolla voit saavuttaa alkamasi kohteen seuraamalla viittauksia (esim. A viittaukset B, B viitteet A). Tämä saa heidät vuotamaan muistiin, koska niitä ei koskaan vapauteta. Swift tarjoaa avainsanat weakja unownedestää vahvat viitesyklit. Tyypillisesti vanhempi-lapsi-suhde käyttää vahvaa viittausta, kun taas lapsi-vanhempi käyttää joko weakviitettä, jossa vanhemmat ja lapset voivat olla toisiinsa riippumattomia, tai unownedjos lapsella on aina vanhempi, mutta vanhemmalla ei ehkä ole lasta. Heikkojen viittausten on oltava valinnaisia ​​muuttujia, koska ne voivat muuttua ja tulla nil.

Sulkeminen luokan sisällä voi myös luoda vahvan viitesyklin tallentamalla itseviittauksia. Omat viittaukset, joita pidetään heikkoina tai tuntemattomina, voidaan ilmaista kaappausluettelon avulla.

Virheenkorjaus ja muut osat

Keskeinen osa Swift -järjestelmää on sen kyky olla virheettömästi virheenkorjattu ja ajettu kehitysympäristössä käyttämällä luku- ja arviointisilmukkaa (REPL), jolloin se tarjoaa interaktiivisia ominaisuuksia, jotka ovat enemmän yhteisiä Pythonin komentosarjaominaisuuksien kanssa kuin perinteinen järjestelmäohjelmointi Kieli (kielet. REPL on edelleen parannettu leikkikentillä , interaktiivisilla näkymillä, jotka toimivat Xcode-ympäristössä ja jotka vastaavat koodin tai virheenkorjaimen muutoksiin lennossa. Leikkikenttien avulla ohjelmoijat voivat lisätä Swift -koodin ja alaskirjausdokumentaation. Jos jokin koodi muuttuu ajan myötä tai jonkin muun vaihteluvälin tuloarvon suhteen, näkymää voidaan käyttää aikajana -avustajan kanssa esityksen osoittamiseksi animoidulla tavalla. Lisäksi Xcodessa on virheenkorjausominaisuuksia Swift -kehitystä varten, mukaan lukien raja -arvot, askelmat ja lauseet, sekä käyttöliittymäelementtien sijoittelujakaumat sovellusten kehittäjille.

Apple sanoo, että Swift on "teollisuuslaatuinen ohjelmointikieli, joka on yhtä ilmeikäs ja nautinnollinen kuin komentosarjakieli".

Esitys

Monilla Swiftin käyttöönotetuilla ominaisuuksilla on tunnettuja suorituskykyä ja turvallisuutta koskevia kompromisseja. Apple on toteuttanut optimointeja, jotka vähentävät tätä yleiskustannusta.

Vertailu muihin kieliin

Swiftiä pidetään C -perheen ohjelmointikielenä ja se on samanlainen kuin C monella tapaa:

  • Useimpia C -operaattoreita käytetään Swiftissä, mutta joitain uusia operaattoreita on esimerkiksi esimerkiksi kokonaislukutoimintojen tukemiseen ylivuotolla (katso erot).
  • Lausekkeita käytetään rypytettyihin hakasulkeisiin .
  • Muuttujat määritetään yhtäläisyysmerkillä , mutta niitä verrataan käyttämällä kahta peräkkäistä yhtäläisyysmerkkiä . Uusi identiteettioperaattori === tarjotaan tarkistamaan, viittaavatko kaksi tietoelementtiä samaan objektiin .
  • Ohjaus lausunnot while, ifja switchovat samankaltaisia, mutta on lisätoimintoja, esimerkiksi, joka on switchjoka vie ei-kokonaisluku tapauksissa whileja iftukemalla kaavoja ja ehdollisesti purkaminen Valinnaiset, forkäyttää syntaksia.for i in 1...10
  • Hakasulkeita käytetään matriisien kanssa sekä niiden ilmoittamiseen että arvon saamiseen tietyllä indeksillä yhdessä niistä.

Sillä on myös yhtäläisyyksiä Objective-C: n kanssa:

  • Numeeriset perustyypit ( Int, UInt, Float, Double)
  • Luokkamenetelmät peritään, kuten esimerkkimenetelmät; selfluokan menetelmissä on luokka, johon menetelmää kutsuttiin.
  • Samankaltainen for... inluetteloinnin syntaksi.

Eroja tavoitteeseen C kuuluvat:

  • Lausekkeiden ei tarvitse päättyä puolipisteisiin ( ;), vaikka niitä on käytettävä sallimaan useamman kuin yhden lausekkeen rivillä.
  • Ei otsikkotiedostoja.
  • Käyttää tyyppipäättelyä .
  • Yleinen ohjelmointi .
  • Toiminnot ovat ensiluokkaisia esineitä.
  • Luettelotapauksissa voi olla liittyvää dataa ( algebralliset tietotyypit ).
  • Operaattorit voidaan määrittää uudelleen luokille ( operaattorin ylikuormitus ) ja uusia operaattoreita voidaan määrittää.
  • Jouset tukevat täysin Unicodea . Useimpia Unicode -merkkejä voidaan käyttää joko tunnisteissa tai operaattoreissa.
  • Ei poikkeuskäsittelyä . Swift 2 esittelee toisen ja yhteensopimattoman virheidenkäsittelymallin.
  • Useita aiempien C-perheen kielten ominaisuuksia, joita on helppo käyttää väärin, on poistettu:
    • Osoittimet eivät näy oletuksena. Ohjelmoijan ei tarvitse seurata ja merkitä nimiä viittauksiin tai poistamiseen.
    • Tehtävät eivät palauta arvoa. Tämä estää yleisen kirjoitusvirheen i = 0sen sijaan, i == 0että heittäisi käännösaikavirheen.
    • Ei tarvitse käyttää breaklausuntoja switchlohkoissa. Yksittäiset tapaukset eivät kuulu seuraavaan tapaukseen, ellei fallthroughlausuntoa käytetä.
    • Muuttujat ja vakiot alustetaan aina ja taulukon rajat tarkistetaan aina.
    • Kokonaislukujen ylivuotot , jotka johtavat määrittelemättömään toimintaan allekirjoitettuihin kokonaislukuihin C: ssä, jäävät ajonaikaiseksi virheeksi Swiftissä. Ohjelmoijat voivat halutessaan sallia ylivuodot käyttämällä erityistä aritmeettinen operaattorit &+, &-, &*, &/ja &%. Ominaisuudet minja ne maxon määritelty Swiftissä kaikille kokonaislukutyypeille, ja niitä voidaan käyttää mahdollisten ylivuotojen turvalliseen tarkistamiseen verrattuna ulkoisiin kirjastoihin kullekin tyypille määritettyihin vakioihin.
    • Yhden lauseen muotoa ifja while, joka mahdollistaa lauseiden jättämisen pois lausekkeen ympäriltä, ​​ei tueta.
    • C-tyylistä luettelointia for (int i = 0; i < c; i++), joka on altis yksittäisille virheille , ei tueta (Swift 3: sta alkaen).
    • Ennen ja jälkeen lisäyksen ja vähentämisen operaattoreita ( i++, --i...) ei tueta (Swift 3: sta alkaen), varsinkin kun C-tyylisiä forlausuntoja ei tueta Swift 3: sta eteenpäin.

Kehitys ja muut toteutukset

Koska kieli on avoimen lähdekoodin, on mahdollista, että se siirretään verkkoon. Joitakin verkkokehyksiä on jo kehitetty, kuten IBM : n Kitura , Perfect ja Vapor .

Apple on myös aloittanut virallisen "Palvelinliittymien" työryhmän, jossa Swift -kehittäjäyhteisön jäsenillä on keskeinen rooli.

Toinen vapaa täytäntöönpanoa Swift että tavoitteet Kaakao , Microsoftin n Common Language Infrastructure ( NET ), sekä Java ja Android -alustan esiintyy osana Elements Compiler alkaen RemObjects Software .

Yhdistämällä työkaluketjut LLVM: stä ja Macintosh Programmer's Workshopista on mahdollista suorittaa hyvin pieni kielijoukko Mac OS 9: ssä .

Katso myös

Viitteet

Ulkoiset linkit