iOS – Swift Dersleri (Tuples, Optionals, Error Handling)

Merhaba Arkadaşlar,
Swift paylaşımlarımıza kaldığımız yerden devam ediyoruz. Bu paylaşımımızda birden fazla bileşenden oluşan tuples veri yapısını, optionals özelliğini ve hataları yönetmede kullanabileceğimiz error handling konularına değineceğiz.

Tuples

Tuples kavramını birden fazla bileşene sahip olan veri yapısı olarak düşünebiliriz. Tuples’ı oluşturan değerler aynı tip olmak zorunda değildir. Birbirinden farklı tipteki değerlerin birarada bulunabildiği birleşik yapılardır. Aşağıdaki örnekteki tuple, HTTP kod ve açıklamasını ifade ediyor.

let http404Error = (404, "Bulunamadı")
// http404Error -> (Int, String) tuples'i, değeri = (404, "Bulunamadı")

(404, “Bulunamadı”) tuples yapısı http dönüş değeri olan bir Int ve bu dönüş değerinin açıklaması olan bir String değerini gruplar. “Int ve String tuples’i” şeklinde ifade edilir.

Herhangi bir tuples yaratmak için herhangi tipteki değerlerden istediğimiz sayıda kullanarak gruplama yapabiliriz. (Int, Int, Int) veya (String, Bool) şeklinde gruplama yapmamız mümkündür.

Tuples’daki değerleri aşağıdaki şekilde ayırıp kullanabiliriz:

let http404Error = (404, "Bulunamadı")
let (statusCode, statusMessage) = http404Error
print("Hata kodu = \(statusCode)")
// ekran çıktısı "Hata kodu = 404"
print("Hata mesajı = \(statusMessage)")
// ekran çıktısı "Hata mesajı = Bulunamadı"

Tuples’daki değerleri ayırırken sadece belirli değerlere ihtiyacımız var ise aşağıdaki şekilde ihtiyacımız olmayanları (_) alttan çizgi ile belirterek önemsemeyebiliriz.

let (justTheStatusCode, _) = http404Error
print("Hata kodu = \(justTheStatusCode)")
// ekran çıktısı "Hata kodu = 404"

Alternatif olarak sıfırdan başlayacak şekilde her bir elemana indeks numarası ile ulaşabiliriz. Herhangi bir değişkene atama yapmamıza gerek kalmaz.

print("Hata kodu = \(http404Error.0)")
// ekran çıktısı "Hata kodu = 404"
print("Hata mesajı = \(http404Error.1)")
// ekran çıktısı "Hata mesajı = Bulunamadı"

Tuples’daki bileşenleri isimlendirip, bu bileşenlere ulaşmak istediğimizde de kendi isimlerini kullanarak ulaşabiliriz.

let http200Status = (statusCode: 200, description: "OK")
print("Durum kodu = \(http200Status.statusCode)")
// ekran çıktısı "Durum kodu = 200"
print("Durum mesajı = \(http200Status.description)")
// ekran çıktısı "Durum mesajı = OK"

Tuples konusunda benim ben en beğendiğim özellik swift’te fonksiyonların tuples dönebiliyor olması. Objective-C ve diğer çoğu dilde fonksiyonlar tek bir değer dönebilir. Diğer dillerde fonksiyonların birden fazla değer dönmesini sağlamak istersek istediğimiz değişkenleri içeren başka bir sınıf ya da enumaration gibi bir yapı oluşturmamız gerekir. Swift’te bir fonksiyonun dönüş değerini tuples olarak ayarlarsak birden fazla değer dönmesini sağlayabiliriz.

Örnek olarak bir Int tipindeki dizinin en büyük ve en küçük elemanını dönen aşağıdaki fonksiyonu inceleyelim:

func minMax(array: [Int]) -> (min: Int, max: Int) {
    var currentMin = array[0]
    var currentMax = array[0]
    for value in array[1..<array.count] {
        if value < currentMin {
            currentMin = value
        } else if value > currentMax {
            currentMax = value
        }
    }
    return (currentMin, currentMax)
}

//aşağıdaki şekilde test edebiliriz:
let bounds = minMax([8, -6, 2, 109, 3, 71])
print("dizideki en küçük sayı \(bounds.min) ve en büyük sayı \(bounds.max)")
// prints "dizideki en küçük sayı -6 ve dizideki en büyük sayı 109"

Optionals

Optional’ları bir değerin “olmama”, başka bir deyişle “boş olma” durumunda kullanırız. Optional’lar bize şunu ifade eder:

Bir değer vardır ve X’e eşittir,
ya da
Bir değer yoktur.

Optional’ları aşağıdaki örneği inceleyerek daha iyi anlayabiliriz. Bir String değerini Int değerine çevirelim. Fakat her String değeri Int değerine çevrilemeyebilir. “123” String’i Int’e çevrilebilirken, “Merhaba Dünya” String’i Int’e çevrilemez. Bu gibi bir durumda initializer’in hata almaması için optional kullanmamız gerekir:

let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
// convertedNumber "Int?", ya da "optional Int" olarak değerlendirilir.

Burada Int fonksiyonu “Int” yerine “optional Int” döner. “Optional Int” “Int?” olarak yazılır. Sonundaki soru işareti bize değerin ya bir integer değere sahip olduğunu ya da herhangi bir değere sahip olmadığını ifade eder. (Herhangi bir Bool ya da String değere sahip olamaz, ya Int değere sahip olur, ya da hiçbir değere sahip olmaz.)

Optional’ı aşağıdaki şekilde nil yapabiliriz.

var serverResponseCode: Int? = 404
// serverResponseCode 404 Int değerine sahiptir
serverResponseCode = nil
// serverResponseCode şimdi hiçbir değere sahip değildir

Optional’a hiçbir değeri atamadan otomatik olarak nil olmasını sağlayabiliriz.

var surveyAnswer: String?
// surveyAnswer otomatik olarak nil olur

Not:
Swift’teki nil ile Objective-C’deki nil aynı şeyler değildir. Objective-C’de nil olmayan bir objeyi gösteren bir pointer iken Swift’teki nil bir pointer değil, bir tipin değerinin olmamasıdır. Sadece object tiplerinin değil, herhangi bir tipin optional’ı nil olabilir.

Optional’ın değere sahip olup olmadığını if kontrolü ile anlayabiliriz. Optional’ın değere sahip olduğundan emin olduğumuzda optional’ın değerine sonuna ünlem işareti koyarak ulaşabiliriz. Bu ünlem bize “bu bir optional’dır ve bir değere sahiptir ve onu kullan” anlamına gelir.

if convertedNumber != nil {
    print("convertedNumber bir integer değerine sahiptir.")
}
// ekran çıktısı "convertedNumber bir integer değerine sahiptir."

if convertedNumber != nil {
    print("convertedNumber ın sahip olduğu integer değeri = \(convertedNumber!).")
}
// ekran çıktısı "convertedNumber ın sahip olduğu integer değeri = 123."

If ya da while statement içinde optional binding yaparak da optional’in değere sahip olup olmadığını anlayabiliriz:

if let actualNumber = Int(possibleNumber) {
    print("\'\(possibleNumber)\' sahip olduğu integer değeri = \(actualNumber)")
} else {
    print("\'\(possibleNumber)\' integer'a çevrilemez")
}
// ekran çıktısı "'123' sahip olduğu integer değeri 123"

Error Handling

Runtime’da alma ihtimalimiz olan hata’ları kontrol altında tutmamıza yarayan bir yapıdır. Herhangi bir hatanın neden alındığını anlayabilir, bu hata durumunu istediğimiz şekilde yönetebiliriz.

Bir fonksiyon çalışırken hata alırsa bir hata fırlatır. Bu fonksiyonu çağıran yerde bu hata yakalanabilir ve hataya göre aksiyon alınabilir.

func canThrowAnError() throws {
    // bu fonksiyon hata fırlatabilir ya da fırlatmayabilir.
}

throws ifadesi bu fonksiyonun hata durumunda hata fırlatacağını belirtir. Bu fonksiyonu çağırdığımız yerde do-try-catch bloğu kullanarak bu hatayı yakalayabiliriz. Yakalamazsak uygulamamız crash olacaktır.

do {
    try canThrowAnError()
    // hata alinmaz ise process buradan devam eder.
} catch {
    // hata fırlatılmışsa yakalanır.
}

Aşağıdaki örneği inceleyecek olursa;
sandvicYap() fonksiyonu temiz bulaşık yok ise veya malzeme yok ise hata fırlatıyor. sandvicYap() fonksiyonu hata almaz ise sandvicYe() fonksiyonu çalışır ve kod sonlanır. sandvicYap() fonksiyonu temiz bulaşık olmaması nedeniyle hata alırsa Error.TemizBulasikYok hatası fırlatılır ve bu hata catch Error.TemizBulasikYok ile yakalanır, bulasiklariYika() çalışır. Benzer şekilde sandvicYap() fonksiyonu malzeme olmaması nedeniyle hata alırsa Error.MalzemeYok hatası fırlatılır ve bu hata catch Error.MalzemeYok ile yakalanır, satınAl(malzemeler) fonksiyonu çalışır. Herhangi bir hata durumunda sandvicYe() fonksiyonu çalışamaz.

enum Error: ErrorType {
        case MalzemeYok(String)
        case TemizBulasikYok
    }

func sandvicYap() throws {
     //...
}
 
do {
    try sandvicYap()
    sandvicYe()
} catch Error.TemizBulasikYok {
    bulasiklariYika()
} catch Error.MalzemeYok(let malzemeler) {
    satınAl(malzemeler)
}

Bu paylaşımımızda Tuples yapısına, fonksiyonların dönüş tipinin tuples olabileceğine, Optional’ları ne olduğu ve nasıl kullanıldığına ve hata durumlarını nasıl kontrol edebileceğimize değinmeye çalıştık. Mobilhanem‘de Swift paylaşımlarına devam edeceğiz. Bizi takipte kalın.

Swift ile ilgili tüm paylaşımlarımıza buradan ulaşabilirsiniz.

iOS – Swift Dersleri (String, Character)

Kaynak: developer.apple.com

0

Aycan Ayhan

1 Yorum

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?