Dari dokumen
Pemeriksaan keamanan 1
Penginisialisasi yang ditunjuk harus memastikan bahwa semua properti yang diperkenalkan oleh kelasnya diinisialisasi sebelum didelegasikan ke penginisialisasi superclass.
Mengapa kita perlu pemeriksaan keamanan seperti ini?
Untuk menjawab ini mari kita lanjutkan proses inisialisasi dalam cepat.
Inisialisasi Dua Fase
Inisialisasi kelas di Swift adalah proses dua fase. Pada fase pertama, setiap properti yang disimpan diberi nilai awal oleh kelas yang memperkenalkannya. Setelah keadaan awal untuk setiap properti yang disimpan telah ditentukan, fase kedua dimulai, dan setiap kelas diberi kesempatan untuk menyesuaikan properti yang disimpannya lebih lanjut sebelum instance baru dianggap siap untuk digunakan.
Penggunaan proses inisialisasi dua fase membuat inisialisasi aman, sambil tetap memberikan fleksibilitas lengkap untuk setiap kelas dalam hirarki kelas. Inisialisasi dua fase mencegah nilai properti diakses sebelum mereka diinisialisasi , dan mencegah nilai properti diatur ke nilai yang berbeda oleh penginisialisasi lain secara tak terduga.
Jadi, untuk memastikan proses inisialisasi dua langkah dilakukan sebagaimana didefinisikan di atas, ada empat pemeriksaan keamanan, salah satunya adalah,
Pemeriksaan keamanan 1
Penginisialisasi yang ditunjuk harus memastikan bahwa semua properti yang diperkenalkan oleh kelasnya diinisialisasi sebelum didelegasikan ke penginisialisasi superclass.
Sekarang, inisialisasi dua fase tidak pernah berbicara tentang pesanan, tetapi pemeriksaan keamanan ini, diperkenalkan super.init
untuk dipesan, setelah inisialisasi semua properti.
Pemeriksaan keamanan 1 mungkin tampak tidak relevan karena,
inisialisasi dua fase mencegah nilai properti diakses sebelum diinisialisasi dapat dipenuhi, tanpa pemeriksaan keamanan ini 1.
Seperti dalam sampel ini
class Shape {
var name: String
var sides : Int
init(sides:Int, named: String) {
self.sides = sides
self.name = named
}
}
class Triangle: Shape {
var hypotenuse: Int
init(hypotenuse:Int) {
super.init(sides: 3, named: "Triangle")
self.hypotenuse = hypotenuse
}
}
Triangle.init
telah diinisialisasi, setiap properti sebelum digunakan. Jadi pemeriksaan Keselamatan 1 tampaknya tidak relevan,
Tapi kemudian mungkin ada skenario lain, sedikit rumit,
class Shape {
var name: String
var sides : Int
init(sides:Int, named: String) {
self.sides = sides
self.name = named
printShapeDescription()
}
func printShapeDescription() {
print("Shape Name :\(self.name)")
print("Sides :\(self.sides)")
}
}
class Triangle: Shape {
var hypotenuse: Int
init(hypotenuse:Int) {
self.hypotenuse = hypotenuse
super.init(sides: 3, named: "Triangle")
}
override func printShapeDescription() {
super.printShapeDescription()
print("Hypotenuse :\(self.hypotenuse)")
}
}
let triangle = Triangle(hypotenuse: 12)
Output:
Shape Name :Triangle
Sides :3
Hypotenuse :12
Di sini jika kita telah memanggil super.init
pengaturan sebelumnya hypotenuse
, super.init
panggilan itu akan memanggil printShapeDescription()
dan karena itu telah ditimpa akan pertama kali mundur ke implementasi kelas Segitiga printShapeDescription()
. Kelas printShapeDescription()
Triangle mengakses hypotenuse
properti non-opsional yang masih belum diinisialisasi. Dan ini tidak diperbolehkan karena inisialisasi dua fase mencegah nilai properti diakses sebelum diinisialisasi
Jadi pastikan inisialisasi Dua fase dilakukan seperti yang didefinisikan, perlu ada urutan panggilan tertentu super.init
, dan itu adalah, setelah menginisialisasi semua properti yang diperkenalkan oleh self
kelas, maka kita perlu pemeriksaan Keselamatan 1