UPGRADE YOUR SKILLS: Learn advanced Swift and SwiftUI on Hacking with Swift+! >>

Döngüler (Loop)

Siz bu tümceyi okurken harcadığınız zaman içerisinde, bilgisayarlar milyonlarca kez sıkıcı görevleri yapmakta harikalar. Sıra kod içindeki görevlerin tekrarına geldiğinde, istersen kodu defalarca kopyala yapıştır yapabilirsin; veya, bir durum doğru olduğu sürece tekrar edecek olan kod blokları olan basit programcılık yapılarını, yani döngüleri kullanabilirsin.

Bunu kanıtlamak için, print() olarak anılan özel derleme fonksiyonunu tanıtmak istiyorum: Ona, yazdırması için bir metin verirsiniz, o da yazdırır. Bizim gibi siz de bir oyun alanında çalışıyorsanız, metninizin sonuç penceresinde belirdiğini göreceksiniz. Eğer Xcode'da gerçek bir uygulama çalıştırıyorsanız, metninizi Xcode'un log (günlük) penceresinde göreceksiniz. Her şekilde de, bir değişkenin içeriğinin ön görüntüsünü almak için print() harika bir yol.

Şu koda bir göz atın:

print("1 x 10 is \(1 * 10)")
print("2 x 10 is \(2 * 10)")
print("3 x 10 is \(3 * 10)")
print("4 x 10 is \(4 * 10)")
print("5 x 10 is \(5 * 10)")
print("6 x 10 is \(6 * 10)")
print("7 x 10 is \(7 * 10)")
print("8 x 10 is \(8 * 10)")
print("9 x 10 is \(9 * 10)")
print("10 x 10 is \(10 * 10)")

Çalışması bittiğinde, oyun alanınızın sonuç panelindeki tabloda 10'un katlarını yazdığını göreceksiniz. Ama tabi bu pek yeterli bir kod değil. Aslında closed range operator (kapalı aralık operatörü) adı verilen ve yan yana 3 noktadan oluşan ... bir rakam aralığı üzerinde döngü yapmak daha temiz bir yoldur.

Kapalı aralık operatörünü kullanarak, tüm bu kodu 3 satırda yeniden yazabiliriz:

for i in 1...10 {
    print("\(i) x 10 is \(i * 10)")
}

Sonuç paneli şimdi, 10 kez çalışan döngümüzdeki "(10'un katları)"nı gösteriyor. Eğer döngünün aslında ne yaptığını bilmek isterseniz, 10'un katlarının sağındaki kareye hemen tıklayın. İçinde "10 x 10 is 100" yazan bir kutu göreceksiniz ve eğer sağ tıklarsanız "Value History" (Değer Tarihçesi) seçeneğini göreceksiniz. Şimdi ona tıklayın ve aşağıdaki resmi görün:

Bir Swift oyun alanı bir döngü çalıştırdığında, döngünün sadece kaç kez çalıştığını gösterir. Eğer değerleri daha yakından incelemek isterseniz, sonuç bölümündeki kutuya tıklayın.

1 ve 10'u da içermek üzere, 1'den 10'a kadar sayan döngüde, sayı i sabitine atanıyor ve ardından süslü parantezlerin içindeki kod bloğu çalıştırılıyor.

Eğer sayının ne olduğunun önemi yoksa, sabit yerine bir altçizgi kullanabilirsiniz. Örneğin, şu şekilde Taylor Swift'in şarkı sözlerinden bazılarını yazdırmak istiyoruz:

var str = "Fakers gonna"

for _ in 1 ... 5 {
    str += " fake"
}

print(str)

Bu kod bloğu, döngü devam ettiği sürece metni ekleyecek ve ekrana "Fakers gonna fake fake fake fake fake" yazdıracak.

Eğer Swift her bir sayıyı döngü devam ettiği sürece bir değişkene atamak zorunda değilse, yazdığınız kod biraz daha hızlı çalışır. Sonuç olarak, eğer for i in… yazıyorsanız ve sonrasında i kullanmıyorsanız, Xcode _ ile değiştirmeyi önerecek.

"Half open range operator" (yarı açık aralık operatörü) olarak anılan bir kapalı aralık operatörü çeşidi daha var ve kolayca kafa karışıklığına yol açabilir. Yarı açık aralık operatörü ..< şeklinde gösterilir ve ilk sayıdan başlayıp, ikinci sayıyı içermeden sonlanır. Örneğin 1 ..< 5 ifadesi, 1, 2, 3, 4'e kadar sayacaktır.

Diziler üzerinde döngü yapma

Swift, dizideki tüm elemanlar üzerinde döngü yapabilmek için basit bir yol sunar. Çünkü Swift, dizinin zaten ne tür bir veri tuttuğunu bilir ve dizideki her bir elemanın üzerinden geçer, isimlendirdiğiniz sabite atar ve sonrasında kod bloğunuzu çalıştırır. Örneğin, aşağıdaki gibi harika şarkılardan oluşan listeyi yazdırabiliriz:

var songs = ["Shake it Off", "You Belong with Me", "Look What You Made Me Do"]

for song in songs {
    print("My favorite song is \(song)")
}

Burada dizi üzerinde isterseniz for i in şeklinde bir döngü de kullanabilirsiniz, çünkü dizinin içindeki indeksi sabit olarak kullanıyorsunuz. Hatta aşağıda gösterildiği gibi, iki ayrı dizideki indeks üzerinde de kullanabiliriz bu sabiti:

var people = ["players", "haters", "heart-breakers", "fakers"]
var actions = ["play", "hate", "break", "fake"]

for i in 0 ... 3 {
    print("\(people[i]) gonna \(actions[i])")
}

Yarı açık aralık operatörlerinin ne için kullanıldığını merak ediyor olabilirsiniz, ama sıfırdan başladıkları için dizilerle çalışmak oldukça kullanışlıdır. Dolayısıyla 0'dan başlayıp 3'e kadar (3 dahil) saymaktansa, 0'dan başlayıp dizi içindeki eleman sayısını hariç bırakarak sayabiliriz.

Unutmayın: Diziler sıfırdan başlar, o yüzden 4 elemanlı bir dizinin indeksi en fazla 3 olabilir; bu da bir döngüde neden hariç bırakarak kullanmamız gerektiğidir.

Bir dizideki elemanları saymak için, someArray.count ifadesini kullanın. Kodumuzu böylece şu şekilde tekrar yazabiliriz:

var people = ["players", "haters", "heart-breakers", "fakers"]
var actions = ["play", "hate", "break", "fake"]

for i in 0 ..< people.count {
    print("\(people[i]) gonna \(actions[i])")
}

Dahili döngüler

İsterseniz, döngüler içine döngüler koyabilirsiniz; hatta o döngülerin içine de döngüler konabilir. Tabi birden kendinizi birşeyi 10 milyon kez yapıyor bulabilirsiniz, o yüzden dikkatli olun!

Şunu oluşturmak için önceki iki döngüyü birleştirebiliriz:

var people = ["players", "haters", "heart-breakers", "fakers"]
var actions = ["play", "hate", "break", "fake"]

for i in 0 ..< people.count {
    var str = "\(people[i]) gonna"

    for _ in 1 ... 5 {
        str += " \(actions[i])"
    }

    print(str)
}

Bu bize "players gonna play play play play play", ardından da "haters gonna…" çıktısını verir. Ana fikri anladınız sanırım.

Önemli bir not: Programcılar geleneksel olarak döngülerde i, j ve hatta k sabitlerini kullanırlar. İstediğiniz ismi verebilirsiniz, ama lütfen kendini anlatan bir isim olsun: for personNumber in 0 ..< people.count şeklinde olması kesinlikle daha doğru.

While döngüleri

Durmasını söyleyinceye kadar kod bloğunu tekrar tekrar çalıştıran bir üçüncü tür döngüyü göreceksiniz. Oyunlar gibi, ne kadar süre sonra sonlanacağını bilmediğiniz yerlerde kullanılır. Sadece tekrar etmeye devam edersiniz; "dokunuşları kontrol, robotları hareketlendir, ekrana çiz, dokunuşları kontrol et..." gibi. ta ki, sonunda kullanıcının bir butona basıp oyundan çıkarak ana menüye geri dönene kadar.

Bu tür döngüler while döngüleri olarak anılır ve şuna benzerler:

var counter = 0

while true {
    print("Counter is now \(counter)")
    counter += 1

    if counter == 556 {
        break
    }
}

Bu kod, break adı verilen yeni bir anahtar sözcük sunuyor. İstediğiniz bir noktada while veya for döngüsünden çıkmak için kullanılır. Bu olmadan kod asla sonlanmaz çünkü durum kontrolünde sürekli "doğru" çıkar ve doğru her zaman doğrudur. break ifadesi olmaksızın, sonsuz bir döngüye girilir ki, bu da kötü birşeydir.

Bu while döngüleri, bilinmeyen bir veri kullandığınızda, internetten birşeyler indirdiğinizde, XML gibi bir dosya okuduğunuzda, kullanıcı girişi beklediğinizde veya bunun gibi bir durumda en iyi şekilde çalışır. Yani bu, yalnızca yeteri kadar çalıştıktan sonra döngünün ne zaman duracağınızı bildiğiniz içindir.

break ifadesinin tam karşıtı continue ifadesidir. Halbuki bir döngüyü kırmak, çalışmayı hemen durdurur ve döngüden sonrasına doğrudan devam eder. Döngü, sadece o andaki yinelemesinden çıkar. Sonrasında döngünün en başına sıçrar ve oradan başlar.

Örnek olarak aşağıdaki kodu inceleyin:

var songs = ["Shake it Off", "You Belong with Me", "Look What You Made Me Do"]

for song in songs {
    if song == "You Belong with Me" {
        continue
    }

    print("My favorite song is \(song)")
}

Bu döngü, Taylor Swift'in 3 şarkısı etrafındadır, ama sadece ikisinin ismini yazdırılacak. Bunun sebebi ise continue anahtar sözcüğüdür: Döngü "You Belong with Me" adlı şarkı adını kullanmayı denediğinde, continue çağırılacak, bu da döngünün hemen başlangıcına geri sıçramasına sebep olacak. Böylece print() asla çağırılmayacak ve bunun yerine doğrudan “Look What You Made Me Do” ile devam edilecek.

BUILD THE ULTIMATE PORTFOLIO APP Most Swift tutorials help you solve one specific problem, but in my Ultimate Portfolio App series I show you how to get all the best practices into a single app: architecture, testing, performance, accessibility, localization, project organization, and so much more, all while building a SwiftUI app that works on iOS, macOS and watchOS.

Get it on Hacking with Swift+

Sponsor Hacking with Swift and reach the world's largest Swift community!

BUY OUR BOOKS
Buy Pro Swift Buy Pro SwiftUI Buy Swift Design Patterns Buy Testing Swift Buy Hacking with iOS Buy Swift Coding Challenges Buy Swift on Sundays Volume One Buy Server-Side Swift Buy Advanced iOS Volume One Buy Advanced iOS Volume Two Buy Advanced iOS Volume Three Buy Hacking with watchOS Buy Hacking with tvOS Buy Hacking with macOS 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!

 
Unknown user

You are not logged in

Log in or create account
 

Link copied to your pasteboard.