我的模板/通用Swift初始化器/构造函数有什么问题?

时间:2015-11-05 08:25:58

标签: ios xcode swift generics swift-protocols

我创建了一个SlidingNavigationController,我想要一个带有三个参数的初始化器。所有三个参数都应该是UIViewControllers,但是他们需要确认我的SlidingIconProtocol。所以我写了这样的代码(简化版):

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())

问题是Swift无法使用以下代码编译最后一行代码:&#34;无法为类型&#39; SlidingNavigationController&#39;调用初始化程序。使用类型&#39;的参数列表(centralVC:CentralVC,leftVC:LeftVC,rightVC:RightVC)&#39;&#34;

不确定为什么这不起作用,因为即使Swift / Xcode完成也让我可以选择使用这个初始化程序。并且所有传递的参数都确认为SlidingIconProtocol。

有没有人知道代码有什么问题,以及Swift实现相同目的的正确方法是什么(是否可能)?

1 个答案:

答案 0 :(得分: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)
}