Swift-tutoriaali: ehtolauseet ja silmukat

Ensimmäinen pikakatsaukseni tutoriaaleineen Applen uuteen Swift-ohjelmoinkieleen sai sosiaalisessa mediassa positiivisen vastaanoton. Kyseisessä artikkelissa tein aivan peruskatsauksen kieleen ja opastin, kuinka muuttujien määrittely tapahtuu ja ruudulle tulostamisen hoidetaan. Nyt olisi tarkoitus siirtyä ehtolauseisiin ja toistorakenteisiin, jotka ovat tärkeä osa mitä tahansa ohjelmointikieltä. Swiftissä ne on toteutettu melkoisen perinteisesti ja muihin kieliin tutustuneet lukijani pääsevät niistä jyvälle nopeasti.

Mitä ehtolauseet ja silmukat ovat? Otetaan tosielämän esimerkki: jos auton ratissa olevaa tööttiä painetaan, kuuluu äänimerkki. Ehtolauseilla pystytään siis määrittämään vaihtoehtoisia tilanteita, jotka suoritetaan niille asetettujen ehtojen täyttyessä. Toinen reaalimaailman esimerkki: jos lompakossani on 100 euroa rahaa, käyn kaupassa. Pääsit varmaan jyvälle? Hyvä, sillä itse koodikaan ei ole kovinkaan monimutkaista ja seuraavien esimerkkien jälkeen osaat jo varmasti luoda Swift-kielellä yksinkertaisia ehtolauseita sisältäviä ohjelmia.

Silmukoiden ja toistorakenteiden ajatuksena on puolestaan toistaa koodia niin kauan, kunnes haluttu ehto täyttyy. Rakenteeltaan ne ovat myös helppolukuisia ja muodostuvat aloittelevallekin koodarille pian loogisiksi.

If-ehtolause
import Cocoa

var luku1 = 10
var luku2 = 20

// Jos luku1 on sama kuin luku2
if luku1 == luku2 {
    println("Luvut ovat samat")
}

// Kun yhdenkään if-lauseen ehdot eivät täyty, suoritetaan else-lause.
else {
    println("Luvut ovat erit")
}

// Komentorivi tulostaa: Luvut ovat erit

Yllä on erittäin yksinkertainen if-ehtolause. Määritetään kaksi muuttujaa, joita vertailemalla tulostetaan ruudulle teksti. Jos luvut ovat arvoltaan samat, suoritetaan ensimmäisen if-lauseen aaltosulkeiden sisällä oleva koodi. Mukana voi olla useampia if-ehtoja. Jos yksikään niistä ei toteudu, suorittaa kääntäjä else-lauseen sisällä olevan koodin.

Tässä kohtaa on hyvä selventää, kuinka Swift-kielessä toteutetaan vertailut:

  • Yhtä kuin: a == b
  • Eri suuret:  a != b
  • Suurempi kuin: a > b
  • Pienempi kuin: a < b
  • Suurempi tai yhtä suuri: a >= b
  • Pienempi tai yhtä suuri a <= b
Switch-ehtolause
import Cocoa


// Luodaan muttujat, jotka ovat tässä tapauksessa vakioita (let)
let nimi = "Teemu"
let luku = 3


//Switch-lause String-muuttujalla
switch nimi {

    case "Niko":
        println("Niko")
    
    case "Matti":
        println("Matti")
    
    case "Teemu":
        println("Teemu")
    
    default:
        println("Ei kukaan")
    
}

//Komentorivi tulostaa: Teemu


//TOINEN ESIMERKKI:


//Switch-lause Int-muuttujalla
switch luku {

    case 0:
        println("0")

// Casen määritys voi sisältää useita vaihtoehtoja, joista yhden täyttyminen riittää suorittamaan kyseisen case-haaran.
    case 0, 1, 2, 3:
        println("Hei, maailma!")
    
    case 4, 5, 6:
        println("Hello, world!")
    
    default:
        break

}

//Komentorivi tulostaa: Hei, maailma!

Switch kuuluu ehtolauseiden joukkoon ja on hyvä vaihtoehto if-lauseelle, jos täytyy käydä läpi useita eri haaroja. Vertailu tapahtuu case-avainsanalla, joista ensimmäinen ehdot täyttävät kohta toteutetaan. Kokonaisuuteen kuuluu myös default-avainsana, jonka sisältö suoritetaan, jos yksikään case-kohdista ei toteudu. Tässäkin tapauksessa esimerkki kertoo enemmän kuin tuhat sanaa, joita yllä on kaksi. Ensimmäisessä käytetään merkkijonoa ja toisessa kokonaislukua vertailun suorittamisessa. Case-avainsana voi sisältää tarvittaessa monta kohtaa/arvoa, jotka erotetaan toisistaan pilkulla.

Switch-lauseessa huomioitavaa on, että ensimmäinen ehdot toteuttava case-haara suoritetaan. Sen jälkeen tulevat ehdot jätetään huomioimatta, vaikka ne täyttäisivätkin tarvittavat ehdot. Toisessa esimerkissä default-haarassa käytetään break-käskyä, koska kääntäjä ei hyväksy tyhjää case- tai default-haaraa. Break pysäyttää Switch-lausekkeen suorittamisen siihen kohtaan.

While-toistorakenne
import Cocoa

var i = 0

// while-lause suoritetaan niin kauan, kunnes määritys "i on pienempi kuin 10" ei enää toteudu
while i < 10 {

    // Kun muuttuja, i , on pienempi kuin 5 tulostetaan x-kirjain. 
    if i < 5 {
        println("x")
    }
    // Lopuksi tulostetaan y-kirjaimia, kun i on suurempi tai yhtä suuri kuin 5.
     if i >= 5 {
         println("z")
     }
i++ // Kasvatetaan i-muuttujaa yhdellä numerolla. Ilman tätä kääntäjä jäisi niin sanostusti loopiin ja toistaisi while-lausetta loputtomiin. Voitaisiin merkitä myös i = i+1
 
}

/* Komentorivi tulostaa:
x
x
x
x
x
z
z
z
z
z

Sitten siirrytään while-silmukkaan. Se on toistorakenne, jonka sisältö käydään läpi ikää kuin kierros kierrokselta, kunnes annettu määre ei enää toteudu. Lauserakenne on seuraava: while ehdot { suoritettava koodi }.

Yllä nähtävässä esimerkissä meillä on i-muuttuja, jonka alkuarvo on 0. Sitä käyttäen luodaan while-lause, jonka lopussa i-muuttujaa yhdellä numerolla kasvattamalla toistetaan lause niin kauan, kunnes määritetty ehto (i on pienempi kuin 10) ei enää toteudu. While-lauseen sisällä sovelletaan aikaisemmin opeteltua if-lausetta, joita esimerkkikoodissa on kaksi. Niillä tulostetaan x- ja y-kirjaimia i-muuttujan arvon perusteella.

import Cocoa

var x = 2

// Kääntäjä käy do-while-lausekkeen sisällön läpi yhden kerran, vaikka lopussa oleva ehto ei missää vaiheessa täyttyisi.
do {
    println("Hei, maailma!")
} while x < 1

// Komentorivi tulostaa: Hei, maailma!

While-silmukasta on olemassa variaatio, joka on do-while-lause. Siinä lauseen sisäinen koodi suoritetaan aina vähintään kerran, koska määrätyn ehdon tarkistus tapahtuu silmukan lopuksi. Yllä hyvin pikainen esimerkki do-while-lauseen toiminnasta.

For-silmukka
import Cocoa

for luku in 1...3 {
    
    if luku == 1 {
        println("yksi")
    }
    
    if luku == 2 {
        println("kaksi")
    }
    
    if luku == 3 {
        println("kolme")
    }
    
}

/* Komentorivi tulostaa:
yksi
kaksi
kolme
*/

// TOINEN ESIMERKKI:

// for-silmukan voi määrittää myös näin.
var x: Int
for x = 0; x < 3; x++ {
    println(x)
    
}

/* Komentorivi tulostaa:
0
1
2
*/

Seuraavana tarkasteluun otetaan for-in-lause. Se on silmukka, jonka tarkoituksena on toistaa lauseen sisäinen koodi useita kertoja. Lauseen muodostaminen tapahtuu yllä nähtävän esimerkin tavoin, jossa silmukka toistetaan kolme kertaa. Jos sama silmukka haluttaisiin toistaa vaikkapa kuusi kertaa, muutettaisiin for-in-lause muotoon: for luku in 1…6.

Esimerkissä käytetty luku-muuttuja saa alkuarvokseen yksi ja kasvaa automaattisesti yhdellä jokaisen kierroksen jälkeen. Kyseiseen muuttujaan ei voida osoittaa enää for-in-lauseen ulkopuolella. Jos tähän  on  kuitenkin tarvetta, täytyy silmukassa käytettävä muuttuja määritellä erikseen. Näin täytyy toimia myös silloin, jos silmukka halutaan muodostaa C-kielestä tutulla tyylillä: for alkuarvo; ehto; muutos. Yllä esimerkki myös kyseisestä käytännöstä.


Näin olemme luoneet katsauksen if-, switch-, while- ja for-lauseisiin. Jos esimerkeistä tai muusta jäi kysyttävää, jätä kommenttia alle. Ensimmäinen osani Swift-artikkelisarjastani löytyy seuraavan linkin takaa: opi tuntemaan Applen Swift-ohjelmointikieli.

Vastaa