无法推断出通用参数“T”

时间:2016-02-02 15:20:18

标签: ios swift generics

我正在重构我的代码并添加对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上检查了类似的问题,但没有一个描述我的情况。

3 个答案:

答案 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类型中推断出来。