2015-11-05 26 views
0

我創建了一個SlidingNavigationController,我想要一個帶有三個參數的初始化程序。所有三個參數都應該是UIViewControllers,但他們需要確認我的SlidingIconProtocol。所以我寫了這樣的(簡本)代碼:我的模板/泛型Swift初始值設定項/構造函數有什麼問題?

struct SlidingItem { 
    var bigIconView: UIView 
    var smallIconView: UIView 
} 

protocol SlidingIconProtocol { 
    var slidingItem: SlidingItem { get set } 
} 

class SlidingNavigationController: UIViewController { 

    init<T:UIViewController where T:SlidingIconProtocol>(centralVC: T, leftVC: T, rightVC: T) { 
     super.init(nibName: nil, bundle: nil) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

} 

class CentralVC: UIViewController, SlidingIconProtocol { 
    var slidingItem = SlidingItem(bigIconView: UIView(), smallIconView: UIView()) 
} 

class LeftVC: UIViewController, SlidingIconProtocol { 
    var slidingItem = SlidingItem(bigIconView: UIView(), smallIconView: UIView()) 
} 

class RightVC: UIViewController, SlidingIconProtocol { 
    var slidingItem = SlidingItem(bigIconView: UIView(), smallIconView: UIView()) 
} 


let myVC = SlidingNavigationController(centralVC: CentralVC(), leftVC: LeftVC(), rightVC: RightVC()) 

的問題是,斯威夫特無法編譯上的代碼的最後一行:「不能與類型的參數列表「調用初始化類型‘SlidingNavigationController’ (centralVC:CentralVC,leftVC:LeftVC,rightVC:RightVC)'「

不知道爲什麼這不起作用,因爲即使Swift/Xcode完成也給了我選項來使用這個初始化器。所有通過參數確認到SlidingIconProtocol。

有誰知道代碼有什麼問題,什麼是正確的方式在Swift中實現相同(是否有可能)?

回答

1

你不能像這樣使用模板。在您的代碼:

init<T:UIViewController where T:SlidingIconProtocol>(centralVC: T, leftVC: T, rightVC: T) 
{ 
    super.init(nibName: nil, bundle: nil) 
} 

T代表一類是UIViewController一個子類,並實現SlidingIconProtocol。因此,當你撥打:

let myVC = SlidingNavigationController(centralVC: CentralVC(), leftVC: LeftVC(), rightVC: RightVC()) 

T被假定爲CentralVC(第一個參數),和init方法將被表示爲:

init< CentralVC:UIViewController where CentralVC:SlidingIconProtocol>(centralVC: CentralVC, leftVC: CentralVC, rightVC: CentralVC) 
{ 
    super.init(nibName: nil, bundle: nil) 
} 

但是要傳遞不同的類對象作爲第二個和第三個參數。它會拋出錯誤。在你的類下面的代碼是有效的:

let myVC = SlidingNavigationController(centralVC: CentralVC(), leftVC: CentralVC(), rightVC: CentralVC()) 

因爲所有傳遞的參數是相同類別(CentralVC)的對象。因此,修復此問題,您需要按以下方式實施init方法:

init<T1:UIViewController, T2:UIViewController, T3:UIViewController where T1:SlidingIconProtocol, T2:SlidingIconProtocol, T3:SlidingIconProtocol>(centralVC: T1, leftVC: T2, rightVC: T3) 
{ 
    super.init(nibName: nil, bundle: nil) 
} 
+0

感謝您的快速回答和解釋。我試過你的解決方案,它的作品! –

+0

@MatejUkmar:很高興聽到:) –

相關問題