2015-11-17 55 views
9

sınıfının örnek özelliklerini belirler İnit yöntemi içinde bir yöntemi çağırmak için zaten orada olan bir yöntem çağrısı aracılığıyla, init olamaz özellikleri . Esasen, UIView alt sınıflarının, init'te bazı alt görünümleri ekleyen bir sınıfa sahibim ve bu alt bölümlerin bazıları, sınıfın örnek değişkenleridir. 'yöntemi çağrısında kendini kullanılması super.init öz başlatır önce' merak ediyorum

class MyView: UIView { 
    var collectionView: UICollectionView 

    convenience init() { 
     self.init(frame:CGRectZero) 
    } 

    override init (frame : CGRect) { 
     super.init(frame : frame) 

     addSubviews() 
    } 

    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 

     addSubviews() 
    } 

    func addSubviews(){ 
     self.collectionView = UICollectionView() 

    } 
} 

Şimdi problem benim sınıfları başlatılıyor önce süper init arayamayacağımı gelir iç özellikleri (Property 'self.collectionView' super.init aramada inialized değil), ama aynı zamanda benim özel arayamazsınız super.init öncesinde bu değişkenleri başlatma yöntemi, bu başlatmadan önce kendini kullanamaz. Örnek değişkenini isteğe bağlı yapabileceğimin farkındayım, ancak daha az zarif görünüyor, çünkü her zaman başlatılacağını biliyorum (ve daha fazlası var, bu sadece basitleştirilmiş bir versiyon). Tüm örnek değişkenlerimi isteğe bağlı yapmadan bunu gerçekleştirmenin herhangi bir yolu var mı?

DÜZENLEME: sonuçta benim soru neden hızlı öncesinde super.init çağıran bir yöntemi çağırmak dis-izin vermez düşünüyorum

?

override init (frame : CGRect) { 
    addSubviews() 
    super.init(frame : frame) 
} 

final func addSubviews(){ 
    self.collectionView = UICollectionView() 
} 

ve

override init (frame : CGRect) { 
    self.collectionView = UICollectionView() 
    super.init(frame : frame) 
} 
+0

başlatılmış edilmemiş bazı özelliklerini kullanabilir yapacak varsa, örtük özellikler Çizelgesi opsiyoneller yapabiliriz. – Moritz

+0

@ EricD. Şu anda bunu yapıyordum, ama ben aslında tüm –

+0

özelliklerini varsayılan olarak – user3441734

cevap

18

Formu belgeleri:

Swift’s compiler performs four helpful safety-checks to make sure that two-phase initialization is completed without error:

Safety check 1 A designated initializer must ensure that all of the properties introduced by its class are initialized before it delegates up to a superclass initializer.

Sen super.init aramadan önce örneği değişkeninin değerini ayarlamak gerekir

() Ve bu eylemin ardından arasındaki fark nedir çağrı örneği yöntemlerine erişirsiniz. Durumda da bunu yapabilirsiniz:

override init (frame : CGRect) { 
    self.collectionView = UICollectionView() 
    super.init(frame : frame) 
    // Now you can call method 
    self.someMethod() 
} 

ADD Sorunun DÜZENLEME için:

Sen güvenlik sebebiyle super.init() aramadan önce yöntemini çağırın olamaz. Eğer daha sonra yöntem, her zaman başlatılır bildiğimiz için henüz ana sınıfına

+1

özelliklerine verdiğimizden emin olmak için derleme zamanı denetimini seviyorum Evet, bununla ilgili tek sorun kodun kodlayıcı init arasında yinelenmesi gerekmesidir ve çerçeve init. Bunu ayrı bir yönteme çekmek idealdir, ancak hızlı bir işlem başlatmadan önce bir yöntemi çağırmanıza izin vermez. Her şeyden –

+0

@KevinDiTraglia İlk Zaten iki kez bu yöntemi çağırmadan ile başlatma çoğaltmak çalıştık. Ve ikincisi, iki temel başlatma kuralından dolayı bunu hızlıca yapamaz: "super.init()" çağrısına ve örnek yöntemlerine, "super.init()" çağrısından sonra çağrılabilir. " –

+0

@KevinDiTraglia I Yanıtı değiştir –