我试过很多不同的方法,但我不擅长泛型。
如何调用一个函数,该函数的变量既需要是像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 {
...
最佳答案
我怀疑错误是因为UIViewController
与NavBarResponder
不自然一致,所以编译器不能保证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/