我正在重构我的代码并添加对Swift 泛型的支持。我遇到了编译器错误。我的代码是:
func dequeueReusableViewController<T: UIViewController where T: Reusable>() -> T {
// Try to fetch view controller from the reuse queue.
if !self.viewControllerReuseQueue.isEmpty {
return self.viewControllerReuseQueue.popFirst()! as! T
}
// Ask delegate to instantiate a new view controller.
return delegate!.reusableViewControllerForPageViewController(self)
}
这顺利编译。然后,稍后,当我尝试将视图控制器出列时:
// Get view controller from the reuse queue.
let viewController: UIViewController = self.dequeueReusableViewController()
我收到了一个错误:
无法推断通用参数“T”
我该如何解决这个问题?我在SO上检查了类似的问题,但没有一个描述我的情况。
答案 0 :(得分:4)
在调用返回泛型类型的泛型函数时,无法指定类型,而不指定要分配给的函数的类型或转换对函数的调用。你可以这样做:
let viewController = self.dequeueReusableViewController() as SomeViewController
或
clipsToBounds
我建议使用第一个选项,除非需要第二个选项(例如需要分配给可选项)。
答案 1 :(得分:1)
编译器无法知道T是什么类型,因为你没有推断它。
您可以强制该方法了解类型T:
func dequeueReusableViewController<T: UIViewController where T: Reusable>(type: T.Type) -> T?
// ...
let viewController = self.dequeueReusableViewController(YourViewController)
或者,稍微整洁一点,你可以让变量完成工作:
func dequeueReusableViewController<T: UIViewController where T: Reusable>() -> T?
// ...
let viewController: YourViewController = self.dequeueReusableViewController()
无论哪种方式,您都需要提供一些帮助,让编译器知道您正在处理的内容。
答案 2 :(得分:0)
如果您使用如下示例
,则应该有效protocol Reusable {
func someMethod()
}
class VC: UIViewController, Reusable {
func someMethod() {
//Implement
}
}
class Dequeuer {
var viewControllerReuseQueue = [VC(),VC(),VC()]
func dequeueReusableViewController<T: UIViewController where T: Reusable>() -> T? {
// Try to fetch view controller from the reuse queue.
return viewControllerReuseQueue.first as? T
}
}
let vc: VC? = Dequeuer().dequeueReusableViewController()
print(vc)
GENERICS -
let viewController = self.dequeueReusableViewController()
只是将值存储在viewController中,但是viewController的类型是未知的,这就是为什么它显示你无法推断通用参数'T'
尝试让viewController:UIViewController = self.dequeueReusableViewController()
然后T将从UIViewController类型中推断出来。