2015-05-19 25 views
6

Bir özelliği içeren hızlı bir protokol var aslında MenuViewController türündedir ancak bunun yerine UIViewController protokolüne onaylamak için bildirilmelidir. Özelliklerine erişebilmek için istediğim doğru sınıfa düşürmek için (self.rootViewController!! MenuViewController) kullanmalıyım. Yukarıdaki basit örneğimde iyidir, ancak özellikle daha karmaşık durumlarda çok okunabilir değildir. Protokol değişkenini bildirmenin daha iyi bir yolu var mı?Swift downcasting ve protokol değişkenleri

Çok teşekkürler!

protocol WireframeProtocol: UIViewController { 
    var rootViewController: UIViewController { get } 
} 

class MenuWireframe : WireframeProtocol 
{ 
    let rootViewController: WireframeProtocol 

    init() 
    { 
     //... 
    } 
} 
+1

, sen/sunum olacak olan bir protokol (Görünüm protokolü) gibi rootviewcontroller beyan ve orada zayıf bir özellik tanımlamak gerekir olabilir . –

+0

Merhaba Daniel, bu doğru ama bu durum farklı bir amaç için. Her tel kafesin, navigasyon amacıyla kullanabileceğim bir UIViewController ortaya koyan bir protokole sahip olmasını isterim. Protokol sadece UIViewControllers için ise bu görüşme protokolünü kullanabilirim ... mmm Bunu kontrol edip size geri döneceğim – bennythemink

+0

@bennythemink cevabımı kontrol ettiniz mi? –

cevap

3

Evet jenerik protokolleri kullanarak daha iyi bir yolu ve şu vardır:

+0

Hi zellb gibi bir şey yapabiliriz, işe yarıyor!Ama neden böyle olduğundan emin değilim. Bana açıklayabilir misin lütfen? – bennythemink

+1

Türü diğer adlar, varolan bir tür için alternatif bir ad tanımlar, bu nedenle UIViewController'den (typealias RootViewController: UIViewController' satırında) alınan tüm türler için yeni bir ad bildirdim. Bundan sonra rootViewController tipini yeni tipimize ayarlıyorum, bu yüzden rootViewController var UIViewController'dan miras alınan sınıflardan yaratılan herhangi bir değeri tutabilir, bu yüzden artık herhangi bir aşağı döküm gerekmeden doğrudan MenuViewController olarak ayarlayabilirsiniz. Umarım –

+0

numaralı telefonun kusursuz olduğunu umarım Zellb. Şimdi bana mantıklı geliyor :) – bennythemink

1

bu deneyin yaptı. Eğer bu gibi protokol benzer beyan gerektiğini uygulamak için: benimsenmesi sınıf set rootViewController tipinde sonra

protocol WireframeProtocol{ 

    typealias RootViewController : UIViewController 
    var rootViewController: RootViewController { get } 

} 

MenuViewController

class MenuWireframe : WireframeProtocol{ 

let rootViewController: MenuViewController 

    init(){ 
     self.rootViewController = MenuViewController(nibName: "MenuViewController", bundle: nil) 
     self.rootViewController.presenter = MenuPresenter(interactor: MenuInteractor()) 
    } 
} 
+0

Merhaba, "UliyewController sınıfından WireframeProtocol sınıfına devredilemez" sınıfını alıyorum:/Bu şekilde çalışmayacağım korkuyorum. Öneriniz için teşekkürler – bennythemink

+0

Evet, bir projede Swift'in başlangıcında bunu eksik buldum. Objective-C'de UIViewController * rootViewController; ' –

2

gibi protokol beyanı, kullanım @ zelb cevabını değiştirebilirsiniz. Eğer böyle bir şey yapabileceğini yapamıyorsanız: Eğer VIPER kullanarak bu yana

class MenuWireframe : WireframeProtocol 
{ 
    var rootViewController: UIViewController { 
     return menuViewController 
    } 

    let menuViewController: MenuViewController! 

    init() 
    { 
     menuViewController = MenuViewController(...) 
     //... 
    } 
} 
+0

Merhaba, öneriniz için teşekkürler. Sadece test ettim ve korkmuyorum. Öncelikle, bu yaklaşımı ile "let" özelliğini kullanamıyorum ve ikinci olarak, eğer özelliklerine erişmek istiyorsam MenuViewController yazmak için rootViewController kullanmam gerekiyor :(ama öneriniz için teşekkürler. – bennythemink

+0

@bennythemink Neden 'let' kullanamazsınız? "rootViewController" yerine "menuViewController" yerine "MenuViewController" yerine, verilen nesnenin aslında "MenuWireFrame" 'in keyfi olduğunu bilmiyoruz. WireFrameProtocol' –

+0

Merhaba, rootViewController artık önerinizde hesaplanmış bir özellik olarak "let" kullanamıyorum. pedantic olabilir ama şimdi aynı zamanda sınıfta bir yerine iki özellik var anlamına gelir.Ama yine de ipucu için teşekkür ederiz . – bennythemink