Belajar Swift : Cara Inisialisasi di Swift - Masnaato
Skip to content Skip to sidebar Skip to footer

Belajar Swift : Cara Inisialisasi di 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 NilaiJenis Kelas
Pewarisan tidak didukung untuk tipe nilai seperti struktur dan pencacahan. Merujuk penginisialisasi lain dilakukan melalui self.initWarisan 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 DitunjukConvenience Initializer
Dianggap sebagai inisialisasi utama untuk kelasDianggap sebagai pendukung inisialisasi untuk sebuah kelas
Semua properti kelas diinisialisasi dan penginisialisasi superclass yang sesuai dipanggil untuk inisialisasi lebih lanjutPenginisialisasi 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 kelasTidak 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"