Swift Init ve Deinit

Merhaba arkadaşlar ,
mobilhanem.com sitemiz için anlattığımız/yayınladığımız Swift Dersleri serimize bu yazımızda Swift Init ve deinit ile devam edeceğiz. Bir önceki yazımızda Swift Inheritance (miras alma)  konusundan bahsetmiştik. Bu derse başlamadan önce xcode’u kurmak ve playground  üzerinde swift kodu yazabilmek için bu dersimizi okumanızı tavsiye ederim.

Initialization Nedir ?

Initialization, class ‘tan, enum ‘dan veya struct ‘dan bir instance oluşturacağımız zaman hazırlanma işlemidir. Bu işlem depolanmış olan her özellik için bir başlangıç değeri ayarlamayı ve kullanıma hazır olmadan önce gerekli işlemlerin yapılmasını sağlar.

Initializers Kullanımı

Initializers parametre almayan fonksiyon gibidir. Ve yapısı şu şekildedir,

init() {
    
}

Hemen örneğimize geçelim,

İlk olarak bir struct oluşturacağız, bu struct ‘ımızın ismi Derece olsun ve bir adet stored property’ miz olsun,

struct Derece {
    var sicaklik: Double
}

Evet Derece struct ‘ımızı oluşturduk. sicaklik isminde Double türünde bir değişken tanımladık. Şimdi ise initializers işlemimizi ekleyelim,

struct Derece {
    var sicaklik: Double
    init() {
        sicaklik = 17.0
    }
}

Yukarıda gördüğünüz gibi sicaklik değişkenimize ilk değer atmasını yapmış olduk. Daha sonra bu struct ‘tan bir instance türetildiğinde ve sicaklik değerini kullandığında değeri 17.0 şeklinde kullanacaktır. Hemen Derece struct ‘ımızdan bir instance türetelim,

var dereceInstance = Derece()

Şimdi ise dereceInstance değişkenimizi kullanarak Derece struct ‘ında bulunan sicaklik değişkeninin değerini görelim,

print(“Default sıcaklık değeri \(sicaklik) ‘dir”)

Yukarıda yaptığımız ilk değer atama işlemini aşağıdaki gibide yapabiliriz,

struct Derece {
    var sicaklik: Double = 17.0
}

Bu durum için initialization işlemini böyle yapmak daha hızlı olacaktır.

Initialization (Init) Parametereleri

Diğer bir değişle ilk değer atama parametreleri, yukarıda parametre almadan yaptığımız initialization işleminin parametre alan halidir. Hemen bir örnek yaparak açıklayayım,

İlk olarak Derece isminde bir struct yaratıcaz ve bu struct ‘ımızın bir değişkeni olacak ve ardından initialization işlemini parametre alacak şekilde gerçekleştireceğiz. Burada paremetre olarak Fahrenheit bir değer alıp onu init methodumuzun içerisinde dereceye çevireceğiz. 1 celsius (fahrenheit – 32 ) / 180 fahrenheit ‘dır.

struct Derece {

    var sicaklikDerece: Double

    init(fahrenheittanDereceye fahrenheit: Double) {

        sicaklikDerece = (fahrenheit - 32.0) / 1.8

    }

}

Evet struct ‘ımızı oluşturduk ve init methodumuzun içini doldurduk şimdi bir instance türetilim ve fahrenheit ‘ı dereceye, init methodumuz yardımıyla çevirelim,

let fahrenheitVerDereceAl = Derece(fahrenheittanDereceye: 152.0)

Değişken isminin yaratıcı olamamasından dolayı kusura bakmayın 🙂

Hesaplanan bu değeri konsolda görmek için,

print(fahrenheitVerDereceAl.sicaklikDerece)

Şeklinde yazabilirsiniz. fahrenheitVerDereceAl, Derece türünde olduğu için sicaklikDerece adinde değişkeni bulunmaktadır.

fahrenheitVerDereceAl değişkenimiz Derece sınıfından türettik ve init methodumuz sayesinde paremetre olarak fahrenheit türünde değer verip celsius türünde değerimizi elde etmiş olduk. Aynı işlemi kelvin için yapıp yorumlara yazabilirsiniz.

Init Dış Paremetre İsmi Olmadan Kullanım

Önceki yazılarda anlattığımdan hiç bir farkı yoktur. Hemen kısaca bir örnekle gösterelim,

struct Derece {

    var sicaklikDerece: Double

    init( _ celsius: Double){

        sicaklikDerece = celsius

    }

}

Daha öncedende yaptığımız gibi Derece isminde bir struct oluşturduk ve sicaklikDerece isimli değişkenimizi tanımladık. Ardından init methodumuzu yazarak “_ “ kullanarak gelen değerimizi sicaklikDerece değişkenimize eşitledik. Çünkü ikiside aynıdır.

Şimdi ise dış parametre ismi olmadan bir instance türetelim ve değerimizi konsola yazdıralım,

let celsiustanCelsiusa = Derece(23.0)

Şeklinde türettik ve farklı olan şey parametre isminin gözükmemesidir. Bunu sağlayan ise init methodumuzu tanımlarken kullandığımız “_” sembolüdür. Bu sembolü kullandığımızda init methodumuzu kullanırken paremetre isminin önemsiz olduğunu gözükmesini istemediğimizi belirtmiş oluyoruz. Geri kalan her şey ise aynı şekilde yapılmaktadır. Şimdi de bu değeri konsolumuzda görelim,

print(celsiustanCelsiusa.sicaklikDerece)

Şeklinde yazarak konsolumuzda çıktımızı gördük. Her hangi bir değişme yok çünkü her hangi bir hesaplama işlemi yapmadık. paremetre olarak verdiğimiz değeri direkt olarak sicaklikDerece isimli değişkenimize atadık.

Deinitialization

Bir sınıf nesnesi Otomatik Referans Sayacı (ORS) mekanizması tarafından heap ’ten yok edilmeden hemen önce o nesne için o sınıfın deinit metodu çağrılır. deinit metodunun parametresi ve geri dönüş değeri yoktur. Bir başka deyişle, objemiz deallocate edilmeden önce işlemler yapmak  için deinit metodunu kullanabiliriz. Deinit metodu objemiz deallocate edilmeden önce çalışır. Hemen genel tanımlaması nasılmış görelim,

class OrnekSinif {
    var a: Int
    init()
    {
        a = 0
        print("Örnek init")
    }
    init(a: Int)
    {
        self.a = a
        print("Örnek init")
    }
    deinit {
        print("Örnek deinit")
    }
}
var sinifInstance: OrnekSinif? = OrnekSinif()
print("Init Deneme")
sinifInstance = nil
print("Deinit Deneme")

İlk olarak OrnekSinif isminde bir sınıf yarattık. Bu sınıfın a isminde Int türünde bir değişkeni bulunmaktadır. Ve bu sınıfın iki adet init methodu bulunmaktadır bunlardan biri parametresiz diğeri ise parametrelidir. Bunların dışında bir de deinit methodumuz bulunmaktadır ve bu methodumuzun içinde ekrana “Örnek deinit” yazısını bastırıyoruz. Ve sınıfımızı yarattıktan sonra OrnekSinif ‘ımızdan bir instance türetiyoruz ve ismine sinifInstance diyoruz. Biz bu tanımlamayı yaptıktan sonra parametre almayan init methodumuz çalışacaktır çünkü a değişkenimize her hangi bir parametre vermedik bu yüzden parametresiz init methodumuz çalışacak ve a değişkenimizin değeri 0 olacaktır. Ardından ise ekrana “Örnek init” yazısını bastıracaktır.  Ve ardından ise işleyişe devam edecek ve ekrana “Init Deneme” yazısını bastıracaktır. Bir sonraki satırda ise instance ‘ımızı nil yaparak deallocate etmiş oluyoruz bu durumda ise sınıfımızın deinit fonksiyonunun çalışmasını sağlıyoruz. Ve deinit fonksiyonumuz çalışıp ekrana “Örnek Deinit” yazısını bastıracaktır ve tekrar işleyişine devam edip bir satır altına ise “Deinit Deneme” yazısını bastıracaktır.

Bir sonraki derste görüşmek üzere 🙂

let anotherSteveJobsQuote = “My model for business is The Beatles: They were four guys that kept each others’ negative tendencies in check; they balanced each other. And the total was greater than the sum of the parts.”

print(anotherSteveJobsQuote)

 

20

Taha Eren Buyruk

Başkent Üniversitesi Bilgisayar Mühendisliği.

Yorum Yaz

Haftalık Bülten

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