Fonksiyonlar - a free Hacking with Swift tutorial
< Previous: Switch case Next: Optionals (Seçimliler) >
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:
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:
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:
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:
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:
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:
Bu fonksiyonu şu şeklide çağırabiliriz:
Ç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:
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:
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:
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:
İş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.
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:
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: