Lazy initialization dalam Swift
– Wikipedia
Dalam pemrograman komputer, inisialisasi Lazy adalah taktik untuk menunda pembuatan objek, perhitungan nilai, atau beberapa proses besar lainnya sampai pertama kali dibutuhkan/dipanggil.
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
- Kamu tidak dapat menggunakan
lazy
denganlet
karena tidak ada nilai awal dan yang didapat nanti ketika diakses. - Kamu tidak dapat menggunakannya dengan
computed property
karenacomputed property
selalu dihitung ulang (membutuhkan CPU) ketika Kamu memodifikasi variabel yang memiliki hubungan dengan propertilazy
. lazy
hanya berlaku untukstruct atau class
Semoga bermanfaat.