我创建了一个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实现相同目的的正确方法是什么(是否可能)?
答案 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)
}