0

我创建了一个 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 无法在最后一行代码上编译:“无法使用类型为 '(centralVC: CentralVC, leftVC: LeftVC, rightVC: RightVC)' 类型的参数列表调用类型 'SlidingNavigationController' 的初始化程序”

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

有谁知道代码有什么问题以及在 Swift 中实现相同目标的正确方法是什么(有可能吗)?

4

1 回答 1

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)
}
于 2015-11-05T08:37:16.233 回答