Swift

**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.

## Ajalugu
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 uusim versioon on Swift 6.2.

## Platvormid

Swift toetab kõiki kaasaegseid Apple'i operatsioonisüsteeme (Darwin, iOS, iPadOS, macOS, tvOS, watchOS), lisaks Linuxi, Windowsi ja WebAssembly operatsioonisüsteeme.

## Võimalused
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.

## Disain
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.

## Süntaks
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")
    }
}
```


## Ligipääsutasemed
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.

## Funktsionaalne programmeerimine
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)
```


## Muutujatüüp <code>Optionals</code>

Swifti ü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!")
}
```


## Asünkroonsus ja paralleelsus
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)
}
```

## Arendustööriistad
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.

## Kasutusvaldkonnad ja näited
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.

## Viited