Swift, Classes, 2, sonvenience init, super.init, override init
By: Selim Selçuk
Tags: Swift Programming, Selimselcuk, iOS App Development, Ios Development, Selimselçuk

Convenience init methodu

Bildiğiniz üzere “Convenience” kolaylık anlamındadır.

Konuyu örneklendirelim;

class Human

{

var name : String



init(name: String)

{

self.name = name

}

}



var ohuman : Human = Human(name: "dirk")

Şimdi Convenience init methodunu yazalım;

class Human

{

var name : String



init(name: String)

{

self.name = name

}



convenience init()

{

self.init(name: "there was no input for the name")

}

}



var ohuman : Human = Human()

Gördüğünüz üzere property’e değer vermeden nesne oluşturabilme esnekliğini kazandık;

print(ohuman.name)

// there was no input for the name

super.init

Bir Super Class bir de Child class tanımlayalım;

Super Class Human olsun

Child Class ise Worker

class Human

{

var name : String

var age: Int



init(name: String, age: Int)

{

self.name = name

self.age = age

}



convenience init()

{

self.init(name: "there was no input for the name", age: 0)

}

}



var ohuman : Human = Human()

print(ohuman.name)



class Worker : Human

{

var job: String

init(name: String, age: Int, job: String)

{

self.name = name

self.age = age

self.job = job

}

}

Worker Class init method içindeki aşağıdaki 2 satır hata verir;

self.name = name

self.age = age

Hatalar şunlardır;

'self' used in property access 'name' before 'super.init' call 'self' used in property access 'name' before 'super.init' call 'super.init' isn't called on all paths before returning from initializer

Çözümü(sadece Worker Class içindeki init methodunu değiştiriyoruz)

class Worker : Human

{

var job: String

init(name: String, age: Int, job: String)

{

self.job = job

super.init(name: name, age: age)

}

}

init methodunu override etmek;

class Human

{

var name : String

var age: Int



init(name: String, age: Int)

{

self.name = name

self.age = age

}



convenience init()

{

self.init(name: "there was no input for the name", age: 0)

}

}



var ohuman : Human = Human()

print(ohuman.name)



class Worker : Human

{

var job: String

init(name: String, age: Int, job: String)

{

self.job = job

super.init(name: name, age: age)

}



override init(name: String, age: Int)

{

self.job = "there was no input for the job detail"

super.init(name: name, age: age)

}

}



var oworker1 : Worker = Worker(name:"dirk", age: 33, job: "football player")

var oworker2 : Worker = Worker(name: "alex", age: 34)

print(oworker2.job)

‘oworker1’ ve ‘oworker2’ nesnelerinde görüleceği üzere init ve override init methodlarını kullandık. Yani ilk nesne için job property değerini verdik, ikinci nesne için ise vermedik.

super.init methodunu parametresiz de kullanabiliriz;

bu arada init methodu aynı ise convenience init ile beraber kullanılamaz;

class Human

{

var name : String

var age: Int



init(name: String, age: Int)

{

self.name = name

self.age = age

}



init()

{

self.name = "no name"

self.age = 0

}



convenience init()

{

self.init(name: "there was no input for the name", age: 0)

}

} // init() methodu aynı. init() ve convenience init()

// bu durumda 2nci yazılan hata verir.

Şimdi örneğe devam edelim, yani super.init() methodunu parametre almadan kullanmak;

class Human

{

var name : String

var age: Int



init(name: String, age: Int)

{

self.name = name

self.age = age

}



init()

{

self.name = "no name"

self.age = 0

}

}

Child class ise şu şekilde;

class Worker : Human

{

var job: String

init(name: String, age: Int, job: String)

{

self.job = job

super.init(name: name, age: age)

}



override init(name: String, age: Int)

{

self.job = "there was no input for the job detail"

super.init(name: name, age: age)

}



override init()

{

self.job = "no job"

super.init()

}

}

Referans: developer.apple.com, swift.org

Makalenin yazıldığı zaman Swift versiyonu: 5.3

İyi çalışmalar.