Belajar Swift : Cara Inisialisasi di Swift
Kelas, struktur, dan enumerasi yang pernah dideklarasikan di Swift 4 diinisialisasi untuk menyiapkan instance kelas. Nilai awal diinisialisasi untuk properti yang disimpan dan juga untuk contoh baru juga nilai diinisialisasi untuk melangkah lebih jauh. Kata kunci untuk membuat fungsi inisialisasi dilakukan dengan metode 'init ()'. Penginisialisasi Swift 4 berbeda dari Objective-C yang tidak mengembalikan nilai apa pun. Fungsinya untuk memeriksa inisialisasi instance yang baru dibuat sebelum diproses. Swift 4 juga menyediakan proses 'deinitialization' untuk melakukan operasi manajemen memori setelah instance dibatalkan alokasinya.
Peran Penginisialisasi untuk Properti Tersimpan
Properti yang disimpan harus menginisialisasi instance untuk kelas dan strukturnya sebelum memproses instance. Properti yang disimpan menggunakan penginisialisasi untuk menetapkan dan menginisialisasi nilai sehingga menghilangkan kebutuhan untuk memanggil pengamat properti. Penginisialisasi digunakan dalam properti tersimpan
Untuk membuat nilai awal.
Untuk menetapkan nilai properti default dalam definisi properti.
Untuk menginisialisasi sebuah instance untuk tipe data tertentu 'init ()' digunakan. Tidak ada argumen yang diteruskan di dalam fungsi init ().
Sintaksis
init() { //New Instance initialization goes here }
Contoh
struct rectangle { var length: Double var breadth: Double init() { length = 6 breadth = 12 } } var area = rectangle() print("area of rectangle is \(area.length*area.breadth)")
Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -
area of rectangle is 72.0
Di sini struktur 'persegi panjang' diinisialisasi dengan panjang dan lebar anggota sebagai tipe data 'Ganda'. Metode Init () digunakan untuk menginisialisasi nilai untuk panjang dan ganda anggota yang baru dibuat. Luas persegi panjang dihitung dan dikembalikan dengan memanggil fungsi persegi panjang.
Mengatur Nilai Properti secara Default
Bahasa Swift 4 menyediakan fungsi Init () untuk menginisialisasi nilai properti yang disimpan. Selain itu, pengguna memiliki ketentuan untuk menginisialisasi nilai properti secara default saat mendeklarasikan anggota kelas atau struktur. Ketika properti mengambil nilai yang sama sendiri di seluruh program, kita bisa mendeklarasikannya di bagian deklarasi saja daripada menginisialisasinya di init (). Menyetel nilai properti secara default memungkinkan pengguna saat warisan ditentukan untuk kelas atau struktur.
struct rectangle { var length = 6 var breadth = 12 } var area = rectangle() print("area of rectangle is \(area.length*area.breadth)")
Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -
area of rectangle is 72
Di sini, alih-alih mendeklarasikan panjang dan lebarnya di init (), nilai-nilai diinisialisasi dalam deklarasi itu sendiri.
Parameter Inisialisasi
Dalam bahasa Swift 4, pengguna memiliki ketentuan untuk menginisialisasi parameter sebagai bagian dari definisi penginisialisasi menggunakan init ().
struct Rectangle { var length: Double var breadth: Double var area: Double init(fromLength length: Double, fromBreadth breadth: Double) { self.length = length self.breadth = breadth area = length * breadth } init(fromLeng leng: Double, fromBread bread: Double) { self.length = leng self.breadth = bread area = leng * bread } } let ar = Rectangle(fromLength: 6, fromBreadth: 12) print("area is: \(ar.area)") let are = Rectangle(fromLeng: 36, fromBread: 12) print("area is: \(are.area)")
Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -
area is: 72.0 area is: 432.0
Parameter Lokal & Eksternal
Parameter inisialisasi memiliki nama parameter lokal dan global yang mirip dengan parameter fungsi dan metode. Deklarasi parameter lokal digunakan untuk mengakses dalam badan inisialisasi dan deklarasi parameter eksternal digunakan untuk memanggil penginisialisasi. Penginisialisasi Swift 4 berbeda dari penginisialisasi fungsi dan metode karena mereka tidak mengidentifikasi penginisialisasi mana yang digunakan untuk memanggil fungsi mana.
Untuk mengatasinya, Swift 4 memperkenalkan nama eksternal otomatis untuk setiap parameter di init (). Nama eksternal otomatis ini sama dengan nama lokal yang ditulis sebelum setiap parameter inisialisasi.
struct Days { let sunday, monday, tuesday: Int init(sunday: Int, monday: Int, tuesday: Int) { self.sunday = sunday self.monday = monday self.tuesday = tuesday } init(daysofaweek: Int) { sunday = daysofaweek monday = daysofaweek tuesday = daysofaweek } } let week = Days(sunday: 1, monday: 2, tuesday: 3) print("Days of a Week is: \(week.sunday)") print("Days of a Week is: \(week.monday)") print("Days of a Week is: \(week.tuesday)") let weekdays = Days(daysofaweek: 4) print("Days of a Week is: \(weekdays.sunday)") print("Days of a Week is: \(weekdays.monday)") print("Days of a Week is: \(weekdays.tuesday)")
Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -
Days of a Week is: 1 Days of a Week is: 2 Days of a Week is: 3 Days of a Week is: 4 Days of a Week is: 4 Days of a Week is: 4
Parameter tanpa Nama Eksternal
Ketika nama eksternal tidak diperlukan untuk inisialisasi, garis bawah '_' digunakan untuk menimpa perilaku default.
struct Rectangle { var length: Double init(frombreadth breadth: Double) { length = breadth * 10 } init(frombre bre: Double) { length = bre * 30 } init(_ area: Double) { length = area } } let rectarea = Rectangle(180.0) print("area is: \(rectarea.length)") let rearea = Rectangle(370.0) print("area is: \(rearea.length)") let recarea = Rectangle(110.0) print("area is: \(recarea.length)")
Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -
area is: 180.0 area is: 370.0 area is: 110.0
Jenis Properti Opsional
Ketika properti yang disimpan pada beberapa contoh tidak mengembalikan nilai apa pun, properti itu dideklarasikan dengan jenis 'opsional' yang menunjukkan bahwa 'tidak ada nilai' yang dikembalikan untuk jenis tertentu itu. Ketika properti yang disimpan dideklarasikan sebagai 'opsional' maka secara otomatis menginisialisasi nilai menjadi 'nil' selama inisialisasi itu sendiri.
struct Rectangle { var length: Double? init(frombreadth breadth: Double) { length = breadth * 10 } init(frombre bre: Double) { length = bre * 30 } init(_ area: Double) { length = area } } let rectarea = Rectangle(180.0) print("area is: \(rectarea.length)") let rearea = Rectangle(370.0) print("area is: \(rearea.length)") let recarea = Rectangle(110.0) print("area is: \(recarea.length)")
Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -
area is: Optional(180.0) area is: Optional(370.0) area is: Optional(110.0)
Memodifikasi Properti Konstan Selama Inisialisasi
Inisialisasi juga memungkinkan pengguna untuk mengubah nilai properti konstan juga. Selama inisialisasi, properti kelas memungkinkan instance kelasnya dimodifikasi oleh kelas super dan bukan oleh subkelas. Perhatikan misalnya pada program sebelumnya 'panjang' dideklarasikan sebagai 'variabel' di kelas utama. Variabel 'panjang' program di bawah ini dimodifikasi sebagai variabel 'konstan'.
struct Rectangle { let length: Double? init(frombreadth breadth: Double) { length = breadth * 10 } init(frombre bre: Double) { length = bre * 30 } init(_ area: Double) { length = area } } let rectarea = Rectangle(180.0) print("area is: \(rectarea.length)") let rearea = Rectangle(370.0) print("area is: \(rearea.length)") let recarea = Rectangle(110.0) print("area is: \(recarea.length)")
Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -
area is: Optional(180.0) area is: Optional(370.0) area is: Optional(110.0)
Penginisialisasi Default
Penginisialisasi default menyediakan instance baru ke semua properti yang dideklarasikan dari kelas atau struktur dasar dengan nilai default.
class defaultexample { var studname: String? var stmark = 98 var pass = true } var result = defaultexample() print("result is: \(result.studname)") print("result is: \(result.stmark)") print("result is: \(result.pass)")
Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut. -
result is: nil result is: 98 result is: true
Program di atas didefinisikan dengan nama kelas sebagai 'defaultexample'. Tiga fungsi anggota diinisialisasi secara default sebagai 'studname?' untuk menyimpan nilai 'nil', 'stmark' sebagai 98 dan 'pass' sebagai nilai Boolean 'true'. Demikian juga nilai anggota di kelas dapat diinisialisasi sebagai default sebelum memproses jenis anggota kelas.
Inisialisasi Memberwise untuk Jenis Struktur
Jika penginisialisasi kustom tidak disediakan oleh pengguna, tipe Structure di Swift 4 akan secara otomatis menerima 'memberwise initializer'. Fungsi utamanya adalah untuk menginisialisasi instance struktur baru dengan inisialisasi memberwise default dan kemudian properti instance baru diteruskan ke inisialisasi anggota berdasarkan nama.
struct Rectangle { var length = 100.0, breadth = 200.0 } let area = Rectangle(length: 24.0, breadth: 32.0) print("Area of rectangle is: \(area.length)") print("Area of rectangle is: \(area.breadth)")
Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -
Area of rectangle is: 24.0 Area of rectangle is: 32.0
Struktur diinisialisasi secara default untuk fungsi keanggotaannya selama inisialisasi untuk 'panjang' sebagai '100.0' dan 'luas' sebagai '200.0'. Tetapi nilai-nilai tersebut diganti selama pemrosesan variabel panjang dan lebarnya sebagai 24.0 dan 32.0.
Delegasi Penginisialisasi untuk Jenis Nilai
Delegasi Penginisialisasi didefinisikan sebagai pemanggil penginisialisasi dari penginisialisasi lainnya. Fungsi utamanya adalah bertindak sebagai dapat digunakan kembali untuk menghindari duplikasi kode di beberapa penginisialisasi.
struct Stmark { var mark1 = 0.0, mark2 = 0.0 } struct stdb { var m1 = 0.0, m2 = 0.0 } struct block { var average = stdb() var result = Stmark() init() {} init(average: stdb, result: Stmark) { self.average = average self.result = result } init(avg: stdb, result: Stmark) { let tot = avg.m1 - (result.mark1 / 2) let tot1 = avg.m2 - (result.mark2 / 2) self.init(average: stdb(m1: tot, m2: tot1), result: result) } } let set1 = block() print("student result is: \(set1.average.m1, set1.average.m2) \(set1.result.mark1, set1.result.mark2)") let set2 = block(average: stdb(m1: 2.0, m2: 2.0), result: Stmark(mark1: 5.0, mark2: 5.0)) print("student result is: \(set2.average.m1, set2.average.m2) \(set2.result.mark1, set2.result.mark2)") let set3 = block(avg: stdb(m1: 4.0, m2: 4.0), result: Stmark(mark1: 3.0, mark2: 3.0)) print("student result is: \(set3.average.m1, set3.average.m2) \(set3.result.mark1, set3.result.mark2)")
Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -
(0.0,0.0) (0.0,0.0) (2.0,2.0) 5.0,5.0) (2.5,2.5) (3.0,3.0)
Aturan untuk Delegasi Penginisialisasi
Jenis Nilai | Jenis Kelas |
---|---|
Pewarisan tidak didukung untuk tipe nilai seperti struktur dan pencacahan. Merujuk penginisialisasi lain dilakukan melalui self.init | Warisan didukung. Memeriksa semua nilai properti yang disimpan diinisialisasi |
Pewarisan Kelas dan Inisialisasi
Jenis kelas memiliki dua jenis penginisialisasi untuk memeriksa apakah properti tersimpan yang ditentukan menerima nilai awal yaitu penginisialisasi yang ditunjuk dan penginisialisasi kenyamanan.
Penginisialisasi yang Ditunjuk dan Penginisialisasi Kenyamanan
Penginisialisasi yang Ditunjuk | Convenience Initializer |
---|---|
Dianggap sebagai inisialisasi utama untuk kelas | Dianggap sebagai pendukung inisialisasi untuk sebuah kelas |
Semua properti kelas diinisialisasi dan penginisialisasi superclass yang sesuai dipanggil untuk inisialisasi lebih lanjut | Penginisialisasi yang ditunjuk dipanggil dengan penginisialisasi praktis untuk membuat instance kelas untuk kasus penggunaan atau jenis nilai input tertentu |
Setidaknya satu penginisialisasi yang ditunjuk ditentukan untuk setiap kelas | Tidak perlu memiliki kemudahan penginisialisasi wajib ditentukan ketika kelas tidak memerlukan penginisialisasi. |
Init (parameter) {pernyataan} | kenyamanan init (parameter) {pernyataan} |
Program untuk Penginisialisasi yang Ditunjuk
class mainClass { var no1 : Int // local storage init(no1 : Int) { self.no1 = no1 // initialization } } class subClass : mainClass { var no2 : Int // new subclass storage init(no1 : Int, no2 : Int) { self.no2 = no2 // initialization super.init(no1:no1) // redirect to superclass } } let res = mainClass(no1: 10) let print = subClass(no1: 10, no2: 20) print("res is: \(res.no1)") print("res is: \(print.no1)") print("res is: \(print.no2)")
Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -
res is: 10 res is: 10 res is: 20
Program untuk Penginisialisasi Kenyamanan
class mainClass { var no1 : Int // local storage init(no1 : Int) { self.no1 = no1 // initialization } } class subClass : mainClass { var no2 : Int init(no1 : Int, no2 : Int) { self.no2 = no2 super.init(no1:no1) } // Requires only one parameter for convenient method override convenience init(no1: Int) { self.init(no1:no1, no2:0) } } let res = mainClass(no1: 20) let print = subClass(no1: 30, no2: 50) print("res is: \(res.no1)") print("res is: \(print.no1)") print("res is: \(print.no2)")
Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -
res is: 20 res is: 30 res is: 50
Inisialisasi Inheritance dan Overriding
Swift 4 tidak mengizinkan subkelasnya untuk mewarisi penginisialisasi superclass-nya untuk tipe anggotanya secara default. Pewarisan berlaku untuk penginisialisasi kelas Super hanya sampai batas tertentu yang akan dibahas dalam Pewarisan Penginisialisasi Otomatis.
Saat pengguna perlu menetapkan penginisialisasi di kelas super, subkelas dengan penginisialisasi harus ditentukan oleh pengguna sebagai implementasi khusus. Ketika menimpa harus dilakukan oleh sub kelas ke kelas super kata kunci 'override' harus dideklarasikan.
class sides { var corners = 4 var description: String { return "\(corners) sides" } } let rectangle = sides() print("Rectangle: \(rectangle.description)") class pentagon: sides { override init() { super.init() corners = 5 } } let bicycle = pentagon() print("Pentagon: \(bicycle.description)")
Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -
Rectangle: 4 sides Pentagon: 5 sides
Penginisialisasi yang Ditunjuk dan Nyaman dalam Tindakan
class Planet { var name: String init(name: String) { self.name = name } convenience init() { self.init(name: "[No Planets]") } } let plName = Planet(name: "Mercury") print("Planet name is: \(plName.name)") let noplName = Planet() print("No Planets like that: \(noplName.name)") class planets: Planet { var count: Int init(name: String, count: Int) { self.count = count super.init(name: name) } override convenience init(name: String) { self.init(name: name, count: 1) } }
Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -
Planet name is: Mercury No Planets like that: [No Planets]
Penginisialisasi Gagal
Pengguna harus diberi tahu jika ada kegagalan penginisialisasi saat menentukan kelas, struktur, atau nilai pencacahan. Inisialisasi variabel terkadang menjadi gagal karena-
- Nilai parameter tidak valid.
- Tidak adanya sumber eksternal yang dibutuhkan.
- Kondisi yang mencegah inisialisasi berhasil.
Untuk menangkap pengecualian yang dilemparkan oleh metode inisialisasi, Swift 4 menghasilkan inisialisasi fleksibel yang disebut 'penginisialisasi gagal' untuk memberi tahu pengguna bahwa ada sesuatu yang tidak diperhatikan saat menginisialisasi struktur, kelas, atau anggota enumerasi. Kata kunci untuk menangkap penginisialisasi yang gagal adalah 'init?'. Selain itu, penginisialisasi yang dapat gagal dan tidak dapat gagal tidak dapat ditentukan dengan jenis dan nama parameter yang sama.
struct studrecord { let stname: String init?(stname: String) { if stname.isEmpty {return nil } self.stname = stname } } let stmark = studrecord(stname: "Swing") if let name = stmark { print("Student name is specified") } let blankname = studrecord(stname: "") if blankname == nil { print("Student name is left blank") }
Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -
Student name is specified Student name is left blank
Penginisialisasi Gagal untuk Pencacahan
Bahasa Swift 4 memberikan fleksibilitas untuk memiliki penginisialisasi Gagal untuk enumerasi juga untuk memberi tahu pengguna ketika anggota enumerasi dibiarkan dari menginisialisasi nilai.
enum functions { case a, b, c, d init?(funct: String) { switch funct { case "one": self = .a case "two": self = .b case "three": self = .c case "four": self = .d default: return nil } } } let result = functions(funct: "two") if result != nil { print("With In Block Two") } let badresult = functions(funct: "five") if badresult == nil { print("Block Does Not Exist") }
Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -
With In Block Two Block Does Not Exist
Penginisialisasi Gagal untuk Kelas
Penginisialisasi yang gagal ketika dideklarasikan dengan enumerasi dan struktur memperingatkan kegagalan inisialisasi pada keadaan apa pun dalam implementasinya. Namun, penginisialisasi yang dapat gagal di kelas akan memperingatkan kegagalan hanya setelah properti yang disimpan telah disetel ke nilai awal.
class studrecord { let studname: String! init?(studname: String) { self.studname = studname if studname.isEmpty { return nil } } } if let stname = studrecord(studname: "Failable Initializers") { print("Module is \(stname.studname)") }
Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -
Module is Optional("Failable Initializers")
Mengganti Penginisialisasi yang Gagal
Seperti halnya inisialisasi, pengguna juga memiliki ketentuan untuk menimpa penginisialisasi failable superclass di dalam subkelas. Inisialisasi gagal kelas super juga dapat diganti dengan inisialisasi non-gagal dalam sub kelas.
Penginisialisasi subkelas tidak dapat mendelegasikan hingga penginisialisasi superclass saat menimpa penginisialisasi superclass yang gagal dengan inisialisasi subkelas yang tidak dapat gagal.
Penginisialisasi yang tidak dapat gagal tidak pernah dapat mendelegasikan ke penginisialisasi yang dapat gagal.
Program yang diberikan di bawah ini menjelaskan penginisialisasi yang dapat gagal dan tidak dapat gagal.
class Planet { var name: String init(name: String) { self.name = name } convenience init() { self.init(name: "[No Planets]") } } let plName = Planet(name: "Mercury") print("Planet name is: \(plName.name)") let noplName = Planet() print("No Planets like that: \(noplName.name)") class planets: Planet { var count: Int init(name: String, count: Int) { self.count = count super.init(name: name) } override convenience init(name: String) { self.init(name: name, count: 1) } }
Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -
Planet name is: Mercury No Planets like that: [No Planets]
The init! Penginisialisasi Gagal
Swift 4 menyediakan 'init?' untuk menentukan penginisialisasi gagal contoh opsional. Untuk mendefinisikan instance opsional yang tidak terbungkus secara implisit dari tipe spesifik 'init!' ditentukan.
struct studrecord { let stname: String init!(stname: String) { if stname.isEmpty {return nil } self.stname = stname } } let stmark = studrecord(stname: "Swing") if let name = stmark { print("Student name is specified") } let blankname = studrecord(stname: "") if blankname == nil { print("Student name is left blank") }
Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -
Student name is specified Student name is left blank
Penginisialisasi yang Diperlukan
Untuk mendeklarasikan setiap subclass dari inisialisasi kata kunci 'diperlukan' perlu didefinisikan sebelum fungsi init ().
class classA { required init() { var a = 10 print(a) } } class classB: classA { required init() { var b = 30 print(b) } } let res = classA() let print = classB()
Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -
10 30 10
Post a Comment for "Belajar Swift : Cara Inisialisasi di Swift"