- Published on
Swiftda Initializer
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
Initializer β bu class yoki struct obyektini yaratish uchun ishlatiladigan maxsus funksiya turi.
Swiftda initializer yaratish uchun init() metodidan foydalanamiz. Masalan,
class Wall {
...
// initializer yaratish
init() {
// boshlang'ich qiymatlarni berish
...
}
}
Bu yerda init() metodi β Wall classining initializeri.
Misol:
Yuqoridagi misolda init() nomli initializer yaratdik. Initializer ichida length propertyga qiymat berdik.
Quyidagi qatorga e'tibor bering:
// obyekt yaratish
var wall1 = Wall()
Bu yerda wall1 obyekti yaratilganda init() initializer chaqiriladi. Va length propertyga 5.5 qiymati beriladi.
Parametrli Initializer
Swift initializeri bir yoki bir nechta parametrlarni qabul qilishi mumkin. Bunday initializerlar parametrli initializer deyiladi.
Keling, misolni ko'raylik:
class Wall {
var length: Double // uzunlik
...
// parametrli initializer
init(length: Double) {
self.length = length
}
}
// obyekt yaratish
var wall1 = Wall(length: 10.5)
Bu yerda:
init(length: Double)βlengthparametrli initializervar wall1 = Wall(length: 10.5)βlengthparametriga10.5qiymatini uzatishself.length = lengthβlengthparametridagi qiymatni (10.5)lengthpropertyga berishself.lengthβlengthpropertysi joriy obyektga (wall1) tegishli ekanligini bildiradi
Misol:
Yuqoridagi misolda ikki parametrli init() initializer yaratdik: length va height. Quyidagi ifodalarni ko'rib chiqing:
var wall1 = Wall(length: 10.5, height: 8.6)
var wall2 = Wall(length: 8.5, height: 6.3)
Bu yerda Wall classidan obyekt yaratishda propertylar uchun qiymatlarni argument sifatida uzatamiz.
Propertylar shunday boshlang'ich qiymatlarga ega bo'lgandan so'ng, calculateArea() metodi bilan devor yuzasini hisoblaymiz.
Initializer Overloading
Swift Initializerlarini funksiya overloading singari overload qilish mumkin.
Initializer overloadingda ikki yoki undan ortiq initializerlar bir xil nomga ega bo'lishi mumkin, agar ularning parametrlari turi yoki soni boshqa-boshqa bo'lsa.
Va obyekt yaratilayotganda uzatilgan argumentlarga qarab, mos initializer chaqiriladi.
Keling, misolni ko'raylik:
Yuqoridagi misolda bitta age propertyga ega Person classi yaratdik.
Shuningdek, ikki xil initializer e'lon qildik: init() va init(age: Int).
person1obyektiga hech qanday argument uzatilmadi, shuning uchun birinchi initializer chaqirildi. Demak,agega20qiymati berildi.person2ga argument sifatida23uzatildi. Shuning uchun ikkinchi initializer chaqirildi vaagega23qiymati berildi.
getAge() metodi age qiymatini qaytaradi va biz uni person1 va person2 yoshini chop etish uchun ishlatamiz.
Convenience Initializer
Oldingi misollarda biz e'lon qilgan initializerlar classning asosiy initializerlari edi. Bu asosiy initializerlar designated initializer ham deyiladi.
Ammo class uchun ikkilamchi/yordamchi initializer ham yaratish mumkin β bu convenience initializer deyiladi.
Convenience initializer yaratish uchun initializer oldidan convenience kalit so'zini ishlatamiz. Masalan,
Yuqoridagi misolda designated initializer: init() va convenience initializer: convenience init() yaratdik.
Convenience initializer ichida designated initializerni chaqirdik va propertyga qiymatlar berdik.
convenience init() {
self.init(name: "Kathmandu University", rank: "1st")
}
university1 obyekti yaratilganda convenience initializer chaqiriladi.
// convenience initializer ishlatish
var university1 = University()
Bu kodimizni designated initializerni chaqirishga qaraganda ancha toza qiladi:
// designated initializerni chaqirish
var university1 = University(name: "Kathmandu University", rank: "1st")
Convenience Initializerlar stored propertylarga standart qiymatlar berish kerak bo'lganda juda foydali.
Failable Initializer
Ba'zi hollarda initializerlar ishga tushishi yoki tushmasligi mumkin, bu failable initializer deyiladi.
Failable initializer yaratish uchun init kalit so'zidan keyin savol belgisi (?) qo'yamiz va agar nimadir noto'g'ri bo'lsa, nil qaytaramiz. Masalan,
Yuqoridagi misolda folder parametrli failable initializer init?() yaratdik.
Va if operatori va isEmpty propertysi yordamida
if (folder.isEmpty) { return nil }
papka bo'sh yoki yo'qligini tekshirdik va agar bo'sh bo'lsa nil qaytardik.
file obyekti uchun bo'sh satr "" uzatdik, bu initialization xatosini keltirib chiqardi, shuning uchun avval ichidagi operator bajarildi, keyin nil qaytardi.
Va nihoyat, else bloki ichidagi operator bajarildi.
Struct uchun Memberwise Initializer
Swiftda struct bilan ishlashda initializer yaratish shart emas. Swift avtomatik ravishda memberwise initializer yaratadi. Masalan,
struct Person {
var name: String // ism
var age: Int // yosh
}
Bu yerda Person structi ichida hech qanday initializer yaratmadik. Ammo Swift avtomatik ravishda memberwise initializer yaratadi:
var person1 = Person(name: "Dwight", age: 43)
Bu yerda qavslar () ichidagi qiymatlar avtomatik ravishda structning mos propertylariga beriladi. Bu memberwise initializer deyiladi.
Misol:
Yuqoridagi misolda avtomatik yaratilgan memberwise initializerni ishlatib Person structining mos propertylariga qiymatlar berdik.
var person1 = Person(name: "Dwight", age: 43)
Bu yerda name ga Dwight, age ga esa 43 qiymati berildi.
Birinchi masalaning yechimi
Keling, birinchi masala "Parametrsiz initializer" ni birga yechib ko'ramiz:
1-qadam: Masalani tushunish
Counter classida:
- count property
- Parametrsiz initializer 0 qiymat bersin
- getCount() methodi count qaytarsin
2-qadam: Yechim algoritmi
- init() ichida count = 0
- getCount() ichida return count
3-qadam: Kodni yozamiz
Natija: Parametrsiz initializerni to'g'ri yaratdik!