| See artikkel räägib programmeerimiskeelest; Swift on ka ansambli D12 liige |
Swift on üldotstarbeline kompileeritav programmeerimiskeel.
See kasutab LLVM-baasil kompileerijat ja kompileerib masinkoodi. Swift programmeerimiskeele töötas välja Chris Lattner 2010. aastal ettevõtte Apple Inc. jaoks, alates 2015. aastast on Swift avatud lähtekoodiga tarkvara.
Programmeerimiskeele Swift väljatöötaja Chris Lattner töötas algul projekti kallal üksi. 2011. aastal liitus projektiga veel Apple'i arendusmeeskonna liikmeid ja 2013. aastast on Swift keel ametlikult Apple'i hallatav arendusprojekt. Keele eesmärk oli asendada varem Apple'i tarkvaras kasutusel olnud Objective-C programmeerimiskeel, Swift kasutab mitmete teiste kaasaegsete programmeerimiskeelte elemente, nende seas Rust, Haskell, Ruby ja Python.
Swifti esmaesitlus toimus 2014. aastal Apple'i rahvusvahelisel arendajate konverentsil WWDC, algselt oli see kasutusel vaid Apple'i-sisese tööriistana. 3. detsembril 2015 avalikustati Swifti lähtekood koos kõigi teekide, siluri ja paketihalduriga ning sellest sai vabavaraline tarkvara. Projekti jaoks loodi veebisait swift.org ja koodi hallatakse GitHubi repositooriumis.
2017. aasta jaanuaris lahkus Chris Lattner Apple'ist ja läks tööle ettevõttesse Tesla Motors. Swifti projekti uueks juhiks sai Ted Kremenek.
Swifti versioon 1.0 avalikustati 9. septembril 2014, praegune[millal?] uusim versioon on Swift 6.2.
Swift toetab kõiki kaasaegseid Apple'i operatsioonisüsteeme (Darwin, iOS, iPadOS, macOS, tvOS, watchOS), lisaks Linuxi, Windowsi ja WebAssembly operatsioonisüsteeme.
Swift on algajasõbralik ja lihtsalt loetav keel, mis on samas kiire ja skaleeritav. Näiteks haldab Swift kogu mälukasutust ja kontrollib muutujate initsialiseerimist enne kasutamist. Järjendite operatsioonide puhul kontrollitakse automaatselt indeksite piiridesse jäämist ja muutuja-operatsioonide puhul ületäitumist. Kasutada saab paralleelselt toimivaid lõimesid. Swift võimaldab kasutada objektorienteeritud programmeerimist, olemas on klassid, alamandmetüübid ja meetodite ülekirjutamine.
Swifti disainis on kõige rohkem sarnasusi programmeerimiskeelega C, üldjuhul töötavad analoogselt kõik operaatorid. Muutujatele omistatakse väärtusi ühekordse võrdusmärgiga ja muutujaid võrreldakse kahekordse võrdusmärgiga. Tingimuslaused switch ja if ning tsüklid for ja while töötavad analoogselt. Nii Swift kui ka C nõuavad muutujate tüüpide määramist kompileerimise ajal (Swift suudab seda enamasti teha automaatselt).
Disainis on olulisel kohal ka turvalisus, näiteks tühjadele objektidele viitamise vältimiseks ei luba Swift vaikimisi muutujate väärtuseks määrata nil. Swift kasutab tugevat staatilist tüübikontrolli, mis võimaldab valet tüüpi muutujatest tingitud vead leida juba enne kompileerimist. Lisaks on turvalisuse ja jõudluse tõttu Swiftile iseloomulik copy-on-write metoodika muutujate väärtuste omistamisel, kus muutujate väärtuste asemel omistatakse muutujatele esialgu viidad ja väärtused kopeeritakse alles siis, kui neid on vaja muuta.
Swift kasutab C-tüüpi keeltega sarnast süntaksit. Kood käivitub vaikimisi globaalses skoobis, lubatud on ka @main abil sisenemispunkti määramine.
Swifti “Hello-world” programm näeb välja selline:
print("Hello, world!")
Koodiread Swiftis ei pea lõppema semikooloniga, kuid semikoolonit saab kasutada mitme koodirea ühele reale toomiseks. Üherealised kommentaarid algavad // sümboliga ja kommentaariplokid algavad /* ja lõppevad */ sümbolitega.
Muutujad Swiftis deklareeritakse var ja konstandid let abil. Peamised andmetüübid:
Int,
Double,
String,
Array,
Dictionary.
var vanus: Int = 21 // täisarvu-tüüpi muutuja var pikkus: Double = 179.8 // ujukomaarvu-tüüpi muutuja var nimi: String = "Enri" // sõnemuutuja var sõbrad: Array<String> = ["Kaarel", "Roland"] // järjend var vanemad: [String: String] = ["ema": "Mirjam", "isa": "Priit"] // võti-väärtus tüüpi muutuja
Tingimuslauseid kirjutatakse kasutades if-else või switch, tsüklite jaoks kasutatakse for-in ja while.
// Loob järjendi numbritega 1 kuni 10
let numbrid = Array(1...10)
// Liigub üle järjendi ja kontrollib, iga elemendi kohta, kas need on paarisarvud
for number in numbrid {
if number % 2 == 0{
print("\(number) on paarisarv")
} else {
print("\(number) on paaritu arv")
}
}
Swift kasutab mälu ja ligipääsutasemete halduseks viit erinevat ligipääsutaset: open, public, internal, fileprivate ja private. Private tähendab, et muutuja või meetod on kättesaadav vaid samas skoobis, fileprivate tähendab, et vaid samas failis. Internal puhul on see kättesaadav vastavast moodulist, public mistahes moodulist ja open korral ka väljaspool mooduleid.
Swift pakub tööriistu funktsionaalseks programmeerimiseks. Selleks kasutatakse märksõnu map, filter ja reduce.
map loob uue massiivi, kus igat element on vastavalt etteantud funktsioonile töödeldud, filter loob uue massiivi, kus on vaid need elemendid, mis vastavad teatud tingimusele, reduce kogub kõik massiivi elemendid vastavalt etteantud reeglile üheks.
// loob massiivi numbritega 1 kuni 6
let numbrid = [1, 2, 3, 4, 5, 6]
// loob massiivi, kus on esialgse massiivi väärtuste kuubid
let kuubid = numbrid.map { $0 * $0 * $0}
// loob massiivi, kus on esialgsest massiivist vaid kolmega jaguvad väärtused
let kolmegaJaguvad = numbrid.filter { $0 % 3 == 0 }
// summeerib kõik esialgse massiivi väärtused
let summa = numbrid.reduce(0) { $0 + $1 }
Lisaks saab Swiftis kasutada anonüümseid funktsioone closure abil. Neid saab edastada funktsioonide parameetritena ja tagastada funktsioonides. See võimaldab funktsionaalset programmeerimist keerukamate andmetega.
// funktsioon matemaatiliste operatsioonide jaoks, kusjuures konkreetset operatsiooni defineeritud ei ole
func operateOnNumbers(_ a: Int, _ b: Int, using operation: (Int, Int) -> Int) -> Int {
return operation(a, b)
}
// anonüümne funktsioon teise funktsiooni argumendina kasutamiseks
let add: (Int, Int) -> Int = { x, y in
return x + y
}
// funktsiooni väljakutse
let sum = operateOnNumbers(3, 5, using: add)
OptionalsSwifti üks iseloomulikumaid võimalusi on optionals andmetüübi kasutamine. Need märgitakse tüübi järel küsimärgiga ja nende väärtus võib olla kas määratud või need võivad olla nil. Seda tüüpi muutujat kasutatakse olukordades, kus muutuja väärtustamine ei ole kindel, näiteks kasutaja sisendi või võrgupäringu töötlemisel. Optionals tüübi kasutamisel on iga kord enne muutuja väärtuse lugemist vaja kontrollida, kas sellel on väärtus. Selline mehhanism aitab vältida tühja muutuja lugemisest tekkivat programmi kokkujooksmist.
let sisend: String? = getUserInput()
if let tekst = sisend {
print("Sisend oli \(tekst)")
} else {
print("Sisend puudub!")
}
Alates versioonist 5.5 võimaldab Swift jõudluse parandamiseks mitmelõimeliste programmide kirjutamist. Selle jaoks kasutatakse async ja await märksõnu. Funktsioone defineerides saab parameetrite järel async märksõna kasutades muuta funktsiooni asünkroonseks, siis saab sellega samal ajal käivitada ka teisi asünkroonseid funktsioone. Kõigi asünkroonsete funktsioonide tööjärje lõppemise ootamiseks kasutatakse await.
func fetchData() async -> String {
try? await Task.sleep(nanoseconds: 1_000_000_000)
return "Andmed laaditud"
}
Task {
let result = await fetchData()
print(result)
}
Swifti peamine arenduskeskkond on Apple'i toodetud Xcode, kus saab kirjutada rakendusi enamikule Apple'i platvormidele. Xcode sisaldab ka Swifti kompilaatorit, tekstiredaktorit ja visuaalseid tööriistu rakenduste loomiseks. Swifti pakette ja teeke hallatakse vabavaralise SwiftPM abil. Swift Toolchain pakub käsurea-tööriistu nagu swift build, swift run ja swift package. Erinevate Swift versioonidega töötamiseks on loodud Swiftly tööriist, mida saab kasutatakse paralleelselt mitme Swift-projektiga töötamiseks.
Kuna Swift toetab Linux operatsioonisüsteemi, saab seda kasutada ka serverite tagaliidese arenduses. Samuti on olemas Swift-põhiseid veebiarendusraamistikke, näiteks Perfect ja Vapor.
Swift programmeerimiskeelt kasutavad oma iOS rakendustes näiteks Firefox, Airbnb ja LinkedIn.