Lazy initialization dalam Swift



Dalam pemrograman komputer, inisialisasi Lazy adalah taktik untuk menunda pembuatan objek, perhitungan nilai, atau beberapa proses besar lainnya sampai pertama kali dibutuhkan/dipanggil.

– Wikipedia

Dalam tulisan kali ini kita akan mempelajari bagaimana menginisialisasi objek menggunakan blok closure dan memahami kapan, di mana, bagaimana, dan mengapa kita menggunakan lazy dalam Bahasa Pemrograman Swift.

Jika Kamu telah mengikuti tutorial online atau melihat-lihat project open source, tidak jarang kita temukan developer menginisialisasi komponen UI dengan cara berikut.

import UIKit

let box: UIView = {
    let view = UIView()
    return view
}()

Membuat Komponen UI

Sekarang mari kita mulai cara “normal” untuk membuat komponen UI secara terprogram.

let buttonSize = CGRect(x: 0, y: 0, width: 100, height: 100)

// ViewControllerOne
let readButton = UIButton(frame: buttonSize)
readButton.backgroundColor = .black
readButton.titleLabel?.text = "Read"
readButton.titleLabel?.textColor = .white

// ViewControllerTwo
let deleteButton = UIButton(frame: buttonSize)
deleteButton.backgroundColor = .black
deleteButton.titleLabel?.text = "Delete"
deleteButton.titleLabel?.textColor = .white

Ya, mungkin cara diatas cukup membosankan.

Membuat Button dengan Fungsi

Sebagai gantinya Kamu dapat membuat fungsinya.

func createButton(enterTitle: String) -> UIButton {
    let button = UIButton(frame: buttonSize)
    button.backgroundColor = .black
    button.titleLabel?.text = enterTitle
	return button
}
createButton(enterTitle: "Ok")

Kode diatas terlihat lebih baik. Namun, ketika Kamu membuat aplikasi tidak semua button memiliki tampilan yang sama, yang kemudian mengharuskan Kamu membuat beberapa parameter tambahan untuk penyesuaian dan itu akan membuat kode kita menjadi kurang readable.

Saatnya “Lazy”

Kata kunci Lazy digunakan di depan variabel.

Lazy Var

Variabel Lazy adalah cara yang sangat nyaman untuk mengoptimalkan kode Kamu, namun mereka hanya dapat digunakan pada struct dan class. Kamu tidak dapat menggunakannya sebagai computed property, ini berarti mereka tidak akan mengembalikan blok closure setiap kali Kamu mencoba mengaksesnya.

class IntenseMathProblem {
    
  	lazy var complexNumber: Int = {
        1 * 1
    }()
}

let problem = IntenseMathProblem() // no value for complexNumber
problem.complexNumber // now, complexnumber is 1

🔊🔊 Ingat : properti lazy tidak diinisialisasi sampai Kamu mengaksesnya. 📢📢

Lazy Dapat Menghindari tipe optional

Kamu juga dapat menghilangkan optional di objek Kamu. Ini bisa bermanfaat jika Kamu berurusan dengan kelas turunan UIView. Misalnya, Kamu memerlukan UILabel untuk hierarki tampilan, Kamu biasanya harus menyatakan properti itu sebagai optional atau sebagai properti tersimpan optional yang tidak dibungkus secara implisit.

Mari kita buat contoh dengan menggunakan lazy dan menghilangkan kebutuhan persyaratan optional yang jahat. 😈

class ViewController: UIViewController {

    lazy var label: UILabel = UILabel(frame: .zero)

    override func loadView() {
        super.loadView()

        self.view.addSubview(self.label)
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        self.label.textColor = .black
        self.label.font = UIFont.systemFont(ofSize: 16, weight: .bold)
    }
}

lazy closure

Kamu dapat menggunakan lazy closure untuk membungkus beberapa kode Kamu di dalamnya.

class ViewController: UIViewController {

    lazy var label: UILabel = {
        let label = UILabel(frame: .zero)
        label.translatesAutoresizingMaskIntoConstraints = false
        label.textColor = .black
        label.font = UIFont.systemFont(ofSize: 16, weight: .bold)
        return label
    }()
}

Di atas adalah cara yang baik jika Kamu ingin membatalkan metode init Kamu. Kamu bisa meletakkan semua logika kustomisasi objek di dalam closure. closure mengeksekusi dirinya sendiri pada read (closure yang dieksekusi sendiri), jadi ketika closure memanggil self.label, blok Kamu akan dieksekusi dan tampilan Kamu akan siap digunakan.

Rules

  1. Kamu tidak dapat menggunakan lazy dengan let karena tidak ada nilai awal dan yang didapat nanti ketika diakses.
  2. Kamu tidak dapat menggunakannya dengan computed property karena computed property selalu dihitung ulang (membutuhkan CPU) ketika Kamu memodifikasi variabel yang memiliki hubungan dengan properti lazy.
  3. lazy hanya berlaku untuk struct atau class

Semoga bermanfaat.

0 0 votes
Rating
Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments

0
Would love your thoughts, please comment.x
()
x