Swift-tutoriaali: funktiot

Funktiot ovat tärkeä osa ohjelmointia. Ne ovat niin sanotusti omia yksiköitään, jotka sisältävät koodin määrätyn tehtävän suorittamiseen. Funktioiden etu on siinä, että samaa koodia ei tarvitse kirjoittaa aina uudelleen. Lisäksi, jos koodissa esiintyy virhe, on sen korjaaminen helpompaa, koska samaa koodinpätkää ei tarvitse kaivaa satojen tai jopa tuhansien koodirivien joukosta. Toki asia voidaan ajatella myös toisinpäin: pieni virhe funktiossa voi vaikuttaa ohjelman useisiin eri osiin. Edut ovat kuitenkin suuremmat, sillä funktiot helpottavan koodin hallitsemista selkeyttämällä luettavuutta ja nopeuttavat ohjelmointia.

Yksinkertainen funktio return-palautusarvolla:
import Cocoa

// Määritellään funktio, joka on nimeltään HeiMaailma ja palauttaa String-muotoisen arvon "Hei, maailma!"
func HeiMaailma() -> String {
    return "Hei, maailma!"
}

// Tulostetaan funktion palautusarvo println-komennolla
println(HeiMaailma())


// Komentorivi tulostaa: Hei, maailma!
Yksinkertainen funktio ilman return-palautusarvoa:
import Cocoa

// Määritellään funktio nimeltään HeiMaailma2. Se tulostaa kutsuttaessa tekstin "Hei, maailma!"
func HeiMaailma2() {
    println("Hei, maailma!")
}

// Kutsutaan funktio. Koska funktion sisältöön kuuluu jo näytölle tulostaminen, ei println-komentoa tarvita enää ensimmäisen esimerkin tavoin, jossa funktio antoi vain palautusarvon.
HeiMaailma2()


// Komentorivi tulostaa: Hei, maailma!

Yksinkertaisimmillaan funktio sisältää funktion nimen, tiedon palautusarvon tyypistä ja return-avainsanalla eteenpäin ohjatun arvon. Funktio määritellään func-avainsanalla: func FUNKTION NIMI() -> PALAUTUSARVON TYYPPI {sisältö}. Toisaalta return-palautusarvoa ei ole pakko antaa, kuten jälkimmäisestä yllä nähtävästä esimerkistä voidaan todeta. Tällöin ei myöskään vaadita määrittelyn yhteydessä nuolella (->) osoitettua palautusarvoa. Yllä kaksi esimerkkiä, jotka suorittavat saman tehtävän eri tavalla. Ne osoittavat, millaisia funktiot yksinkertaisimmillaan voivat olla.

Fuktio, joka ottaa vastaan parametreja:
import Cocoa

// Funktio, joka tulostaa tervehdyksen, käyttäjän nimen, iän ja syntymävuoden.

func tervehdys (nimi: String, ika: Int) {
    var syntvuosi = 2014 - ika
    println("Tervehdys, \(nimi)! Olet \(ika) vuotta vanha. Olet siis syntynyt vuonna \(syntvuosi)")
    
}


// Kutsutaan funktio ja annetaan sille tarvittavat arvot.
tervehdys("Teemu", 20)


// Komentorivi tulostaa: Tervehdys, Teemu! Olet 20 vuotta vanha. Olet siis syntynyt vuonna 1994

Kolmantena esimerkkinä laajennetaan käsitystä funktioista parametreilla. Niiden avulla funktion on mahdollista ottaa vastaan arvoja ja näin muuttaa lopputulosta. Parametrit määritellään funktion nimen jälkeen sulkeiden sisään ja ne erotetaan toisistaan pilkulla (,). Yllä olevassa esimerkissä meillä on kaksi parametria, jotka ovat nimi ja ika. Perustaltaan määritys tapahtuu siis seuraavasti: func NIMI (paramertri1, parametri2, parametri3 jne.) {sisältö}.

Funktio kolmella parametrilla. Laskee suorakulmion pinta-alan:
import Cocoa

// Funktio laskee suorakulmion pinta-alan pituuden ja leveyden perusteella. Mukana myös kolmas parametri, johon määritellään käytössä oleva mittayksikkö (mm, cm, m, km jne.)

func NelioPintaAla(pituus: Int, leveys: Int, yksikko: String) {
    var ala = pituus * leveys
    var mittayksikko = yksikko + "²"
    
    println("Suorakulmion pinta-ala: \(ala)\(mittayksikko)")
    
}

// Kutsutaan funktio
NelioPintaAla(10, 20, "cm")


// Komentorivi tulostaa: Suorakulmion pinta-ala: 200cm²

Erityisesti parametrit tekevät funktioista todella hyödyllisiä. Niiden avulla voidaan luoda monimutkaisiakin funktioita, jotka suorittavat määrätyn tehtävän annettujen arvojen perusteella. Yllä vielä esimerkki funktiosta, joka laskee suorakulmion pinta-alan. Mukana on kaikkiaan kolme parametria, joista viimeinen määrittelee käytettävän mittasuhteen.

Edistynyt funktio. Laskee yhteen tai kertoo annetun määrän kokonaislukuja
import Cocoa

// Määritellään funktio numerot. Se laskee yhteen/kertoo rajoittamattoman määrän lukuja tulostaen ruudulle laskutoimituksen lopputuloksen.

func numerot (LaskuTapa: String, num: Int...) {
    var tulos: Int
    
    // Jos laskutavaksi valittiin "+" lasketaan annetut luvut yhteen ja tulostetaan lopputulos
    if LaskuTapa == "+" {
        
        tulos = 0
        for luku in num {
            tulos += luku
        }
        
        println("tulos:\(tulos)")
    }
    
    // Jos laskutavaksi annettiin "x" kerrotaan luvut (luku1*luku2*luku3 jne) ja tulostetaan lopputulos
    if LaskuTapa == "x" {
        tulos = 1
        for luku in num {
            tulos *= luku
        }
        
        println("tulos:\(tulos)")
    }

}

// Kutsutaan funktio kaksi kertaa
numerot("x", 10, 2)
numerot("+", 10, 10, 10, 10, 5)


/* Komentorivi tulostaa:
Tulos: 20
Tulos: 45
*/

Viimeisenä esimerkkinä luomme hieman monipuolisemman funktion, joka annetun määreen perusteella laskee yhteen tai kertoo rajoittamattoman määrän lukuja. Tähän tarvitaan vain kaksi parametria. Ensimmäinen on LaskuTapa, joka määrittää lasketaanko luvut yhteen (+) vai kerrotaanko (x) ne. Toisena parametrina on num, jonka perässä on kolme pistettä (…). Tämä tarkoittaa sitä, että funktio kykenee vastaanottamaan rajoittamattoman määrän kyseisen tyypin parametreja. Näin pyydettäviä lukuja ei tarvitse rajoittaa tiettyyn määrään, joka avaa käyttöön uusia mahdollisuuksia. Huomioitavaa on, että funktiossa voi olla ainoastaan yksi tällainen parametri ja se tulee olla aina parametrijoukon viimeisenä. Tarvittaessa kyseinen parametri voidaan jättää myös ilman arvoa, joka ei aiheuta kääntäjässä virheilmoitusta.


Näin artikkelisarjani Applen uudesta Swift-ohjelmointikielestä on edennyt jo kolmateen osaansa. Lue aikaisemmat osat alta:

Toivoittavasti esimerkeistä on ollut hyötyä! Jos ohjelmoinnin perusteet ovat hallinnassa, pystyt nyt luomaan jo varsin monipuolista koodia Swift-kielellä. Katsotaan, vieläkö juttusarjani jatkuu vai oliko tämä jo viimeinen osa. Mitä haluaisit vielä käsiteltävän? Jätä ehdotuksesti alle, kiitos!

Vastaa