Gönderen docs
Güvenlik kontrolü 1
Atanmış bir başlatıcı, bir üst sınıf başlatıcıya kadar yetki vermeden önce, sınıfının getirdiği tüm özelliklerin başlatılmasını sağlamalıdır.
Neden böyle bir güvenlik kontrolüne ihtiyacımız var?
Bunu cevaplamak için hızlı bir şekilde başlatma sürecine geçelim.
İki Fazlı Başlatma
Swift'te sınıf başlatma iki aşamalı bir süreçtir. İlk aşamada, saklanan her özelliğe, onu tanıtan sınıf tarafından bir başlangıç değeri atanır. Depolanan her özellik için başlangıç durumu belirlendikten sonra, ikinci aşama başlar ve her sınıfa, yeni örneğin kullanıma hazır olduğu düşünülmeden önce depolanan özelliklerini daha da özelleştirme fırsatı verilir.
İki aşamalı bir başlatma işleminin kullanılması, bir sınıf hiyerarşisindeki her sınıfa tam esneklik sağlarken başlatmayı da güvenli kılar. İki aşamalı başlatma, özellik değerlerine başlatılmadan önce erişilmesini engeller ve özellik değerlerinin başka bir başlatıcı tarafından beklenmedik bir şekilde farklı bir değere ayarlanmasını engeller.
Bu nedenle, iki adımlı başlatma işleminin yukarıda tanımlandığı gibi yapıldığından emin olmak için dört güvenlik kontrolü vardır, bunlardan biri,
Güvenlik kontrolü 1
Atanmış bir başlatıcı, bir üst sınıf başlatıcıya kadar yetki vermeden önce, sınıfının getirdiği tüm özelliklerin başlatılmasını sağlamalıdır.
Şimdi, iki aşamalı başlatma hiçbir zaman siparişten bahsetmez, ancak bu güvenlik kontrolü, super.init
tüm özelliklerin başlatılmasından sonra sipariş verilmesini sağlar.
İki aşamalı başlatma özelliği , bu güvenlik kontrolü 1 olmadan başlatılmadan önce özellik değerlerine erişilmesini önlediği için güvenlik kontrolü 1 önemsiz görünebilir
.
Bu örnekteki gibi
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
kullanılmadan önce her özelliği başlattı. Güvenlik kontrolü 1 önemsiz görünüyor,
Ama sonra başka bir senaryo, biraz karmaşık olabilir,
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)
Çıktı :
Shape Name :Triangle
Sides :3
Hypotenuse :12
Burada super.init
önce ayarını çağırmış olsaydık hypotenuse
, super.init
çağrı daha sonra çağrılmış olacaktı printShapeDescription()
ve bu geçersiz kılındığından, önce Üçgen sınıfı uygulamasına geri dönecekti printShapeDescription()
. printShapeDescription()
Üçgen sınıf erişim hypotenuse
olmayan bir isteğe bağlı özellik hala başlatıldı edilmediğini. İki fazlı başlatma, özellik değerlerine başlatılmadan önce erişilmesini engellediğinden buna izin verilmez
Bu nedenle, İki fazlı başlatmanın tanımlandığı gibi yapıldığından emin olun, belirli bir çağrı sırası olmalıdır super.init
ve bu, self
sınıf tarafından sunulan tüm özellikleri başlattıktan sonra , bir Güvenlik kontrolüne ihtiyacımız var 1