我试过很多不同的方法,但我不擅长泛型。
如何调用一个函数,该函数的变量既需要是像UIViewController这样的实体类型,也需要符合像NavBarResponder这样的协议?
谢谢!

weak var lastNavBarResponder: UIViewController?

func reloadExtendedNavBar() {
    self.updateState()
    self.updateStatusBadges()
    if let vc = self.lastNavBarResponder {
        self.setup(viewController: vc) // Error: Generic parameter T cannot be inferred
    }
}

func setup<T: UIViewController>(viewController: T) where T: NavBarResponder {
...

最佳答案

我怀疑错误是因为UIViewControllerNavBarResponder不自然一致,所以编译器不能保证lastNavBarResponder符合setup的要求。
尝试将lastNavBarResponder更改为符合UIViewController协议的NavBarResponder类型。
下面是一个自包含的示例,说明如何实现这一点。

protocol NavBarResponder {}

class NavBarResponderController: UIViewController {}
extension NavBarResponderController: NavBarResponder {}

var lastNavBarResponder: NavBarResponderController? = NavBarResponderController()

func setup<T: UIViewController>(viewController: T) where T: NavBarResponder {
    print("Works")
}

func reloadExtendedNavBar() {

    if let vc = lastNavBarResponder {
        setup(viewController: vc)
    }
}

reloadExtendedNavBar()

关于swift - Swift泛型,无法推断T型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44726608/

10-11 22:33