NEW: Join my free 100 Days of SwiftUI challenge today! >>

Fonksiyonlar

Fonksiyonlar, belirli fonksiyonellikleri olan parçaları işleten yeniden kullanılabilen kod parçaları tanımlamanızı sağlar. Genellikle fonksiyonlar, çalıştıkları şekli değiştiren bazı değerler kabul edebilirler, ama bu gerekli değil.

Basit bir fonksiyonla başlayalım:

func favoriteAlbum() {
    print("My favorite is Fearless")
}

Eğer bu kodu oyun alanınıza koyarsanız, hiçbir şey yazdırılmaz. Evet, fonksiyonda herhangi bir yanlışlık yok. İçerisinde "My favorite is Fearless" mesajı bulunan favoriteAlbum() adındaki bu fonksiyonun hiçbir şey yazdırmamasının sebebi, bu fonksiyonun çağırılmamasıdır. Fonksiyonu çalıştırmak için alt satıra şu kodu ekleyin:

favoriteAlbum()

Bu şekilde fonksiyon çalıştırılır (veya "çağırılır"), böylece biz de "My favorite is Fearless" çıktısını görebiliriz.

Gördüğünüz gibi, bir fonksiyon func yazarak tanımlanır, ardından fonksiyonun adı ve parantezler açılır ve kapanır, parantezlerin içine de kod bloğu yerleştirilir. Fonksiyonun adını takip eden parantezler konularak çağırılır.

Tabi bu budalaca bir örnek; bu fonksiyon ne olursa olsun aynı şeyi yapar, yani varoluşunun bir anlamı yoktur. Ama ya her defasında farklı bir albümü yazmasını isteseydik? bu durumda, Swift'e fonksiyonumuz her çağrıldığında bir değer kabul etmesini, ardından da bu değeri kullanmasını isteyebilirdik.

Hadi şimdi bunu yapalım:

func favoriteAlbum(name: String) {
    print("My favorite is \(name)")
}

Bu, bir String olması gereken ve "name" olarak adlandırılan (parametre de denebilir) bir değer kabul eden fonksiyon istediğimizi Swift'e söyler. That tells Swift we want the function to accept one value (called a "parameter"), named "name", that should be a string. Sonra biz de çıktı mesajımızın içine doğrudan sevdiğimiz albümümüzün adını yazmak için String eklemesini (interpolasyon) kullanırız. Şimdi fonksiyonu çağırmak için, şunu yazabilirsiniz:

favoriteAlbum(name: "Fearless")

Hala amacın ne olduğunu merak ediyor olabilirsiniz; sonuçta verilen tek satırlık bir kod. Şöyle düşünün: Biz bu fonksiyonu büyük bir uygulamanın 20 farklı yerinde kullandık. Sonra baş tasarımcı geldi ve mesajı "I love Fearless so much – it's my favorite!" ile değiştirmenizi söyledi. Kodunuzdaki tüm bu 20 fonksiyonu tek tek bulup değiştirmeyi gerçekten ister misiniz? Muhtemelen hayır. İşte, fonksiyonla bunu bir kez değiştirirsiniz ve her şey güncellenir.

Fonksiyonunuzu istediğiniz kadar parametre kabul edecek şekilde oluşturabilirsiniz. Bu fonksiyonu bir name (isim) ve year (yıl) kabul edecek şekilde yapalım:

func printAlbumRelease(name: String, year: Int) {
    print("\(name) was released in \(year)")
}

printAlbumRelease(name: "Fearless", year: 2008)
printAlbumRelease(name: "Speak Now", year: 2010)
printAlbumRelease(name: "Red", year: 2012)

Bu fonksiyon parametre isimleri önemlidir ve aslında fonksiyonun kendisinin parçalarıdır. Bazen aynı adla bir çok fonksiyon görürsünüz; örneğin handle(), ama farklı eylemleri ayıracak olan şey farklı parametre isimleridir.

Dahili ve harici parametre isimleri

Bazen fonksiyon çağrıldığı zaman kullanmak için parametreleri isimlendirirsin, bazen de fonksiyonun içinde kullanılması için isimlendirirsin. Bu, bir fonksiyonu çağırdığında çoğunlukla doğal İngilizce kullandığı anlamına gelir, ama fonksiyonun içinde parametreler duyarlı isimlere sahiptir. Bu teknik Swift dilinde çok sık kullanılır, o yüzden şimdi anlamaya değer bir konudur.

Bunu göstermek için, bir String'deki harf sayısını veren bir fonksiyon yazalım. String'lerin özelliklerinden olan count ifadesini kullanalım. Dolayısıyla şu şekilde yazabiliriz:

func countLettersInString(string: String) {
    print("The string \(string) has \(string.count) letters.")
}

Bu fonksiyonu şu şeklide çağırabiliriz:

countLettersInString(string: "Hello")

Çalışmasında bir sorun olmamasına rağmen, biraz sözcükvari oldu bu şekliyle. Ayrıca "count letters in string string hello" (hello stringi stringindeki harfleri say) ifadesini sesli olarak söylemek de kulağa hoş gelmeyecek.

Swift dilinin çözümü, parametre için bir ismi çağrıldığında kullanmak için, diğerini de metodun içinde kullanmak için tanımlamanıza izin vermek olacaktır. Bunu kullanmak için, parametre adını bir harici, bir de dahili olmak üzere iki kez yazmak yeterli.

Örneğin parametre adını, çağrıldığı zaman kullanmak için myString, metodun içinde kullanmak için ise str olarak verebiliriz:

func countLettersInString(myString str: String) {
    print("The string \(str) has \(str.count) letters.")
}

countLettersInString(myString: "Hello")  

Harici parametre adını _ alttan çizgi olarak da tanımlayabilirsiniz. Bu şekilde kullanım, Swift diline harici ismin çok da önemli olmadığını söyler. Örneğin:

func countLettersInString(_ str: String) {
    print("The string \(str) has \(str.count) letters.")
}

countLettersInString("Hello")

Gördüğünüz gibi bu, kodu İngilizce bir tümce okuyormuş gibi yapar: “count letters in string hello" (hello String'indeki harfleri say".

Alttan çizgi _ kullanımının doğru bir seçim olduğu bir çok durum olduğu halde, Swift programcıları genellikle parametrelerini isimlendirmeyi tercih ederler. Şöyle düşünün: Neden fonksiyondaki "String" sözcüğüne ihtiyacımız olsun ki? Biz harfleri saymaktan başka birşey istemiyoruz ki.

O yüzden genellikle harici parametre isimleri olarak "in", "for" ve "ile" ve dahili isimler için de daha anlamlı sözcükler görürüz. Bu fonksiyonun daha Swiftvari versiyonu şu şekilde olacaktır:

func countLetters(in string: String) {
    print("The string \(string) has \(string.count) letters.")
}

Fonksiyonun içerisinde bir anlamı olmayan, ama "in" adlı parametreyle fonksiyonu çağırabileceğin anlamına gelir bu. Zaten fonksiyonun içerisinde "string" adıyla aynı parametrereyi çağırmak, daha kullanışlı olacaktır. Dolayısıyla fonksiyon şu şekilde çağırılabilir:

countLetters(in: "Hello")

İşte bu gerçek bir Swiftvari kod şekli: Doğal İngilizce gibi okunur "count letters in hello" (hello'daki harfleri say) ve kodunuzu daha açık ve öz hale getirir.

Döndürülen değerler

Swift fonksiyonları, parametre listesinden sonra -> işareti ve veri tipi yazılarak bir değer döndürebilir. Bunu yaptığınızda, Swift, fonksiyonunuzun her halükarda bir değer döndüreceğini garantiler. İşte bu, kodunuzun yapacağı şey konusunda bir vaatte bulunmaktır.

Örnek olarak, bir albüm adı Taylor Swift'e aitse doğru, başka birine aitse yanlış değerini döndürecek bir fonksiyon yazalım. Fonksiyon bir parametre kabul edecek (kontrol edilecek albüm adı) ve geriye bir Boolean değeri döndürecek. İşte kodumuz:

func albumIsTaylor(name: String) -> Bool {
    if name == "Taylor Swift" { return true }
    if name == "Fearless" { return true }
    if name == "Speak Now" { return true }
    if name == "Red" { return true }
    if name == "1989" { return true }

    return false
}

Eğer yeni öğrendiğiniz switch/case ifadesini kullanmak isterseniz, bu fonksiyon uygun bir yer olacaktır.

Albüm adlarını geçerek, fonksiyonu çağırıp sonucu görebilirsiniz:

if albumIsTaylor(name: "Red") {
    print("That's one of hers!")
} else {
    print("Who made that?!")
}

if albumIsTaylor(name: "Blue") {
    print("That's one of hers!")
} else {
    print("Who made that?!")
}

LEARN SWIFTUI FOR FREE I have a massive, free SwiftUI video collection on YouTube teaching you how to build complete apps with SwiftUI – check it out!

MASTER SWIFT NOW
Buy Testing Swift Buy Practical iOS 12 Buy Pro Swift Buy Swift Design Patterns Buy Swift Coding Challenges Buy Server-Side Swift (Vapor Edition) Buy Server-Side Swift (Kitura Edition) Buy Hacking with macOS Buy Advanced iOS Volume One Buy Advanced iOS Volume Two Buy Hacking with watchOS Buy Hacking with tvOS Buy Hacking with Swift Buy Dive Into SpriteKit Buy Swift in Sixty Seconds Buy Objective-C for Swift Developers Buy Beyond Code

Was this page useful? Let us know!