Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift泛型,无法推断类型T_Swift_Generics - Fatal编程技术网

Swift泛型,无法推断类型T

Swift泛型,无法推断类型T,swift,generics,Swift,Generics,我试过很多不同的方法,但我不擅长泛型。 我如何调用一个变量既需要是实体类型(如UIViewController)又需要符合协议(如NavBarResponder)的函数? 谢谢 弱变量响应者:UIViewController? func重载ExtendedNavBar(){ self.updateState() self.updateStatusBadges() 如果让vc=self.lastNavBarResponder{ self.setup(viewController:vc)//错误:无

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

弱变量响应者:UIViewController?
func重载ExtendedNavBar(){
self.updateState()
self.updateStatusBadges()
如果让vc=self.lastNavBarResponder{
self.setup(viewController:vc)//错误:无法推断通用参数T
}
}
func设置(viewController:T),其中T:NavBarResponder{
...

我怀疑错误是因为
UIViewController
不符合
NavBarResponder
,因此编译器无法保证
lastNavBarResponder
符合
设置的要求

尝试将
lastNavBarResponder
更改为符合
NavBarResponder
协议的
UIViewController
类型

下面是一个自包含的示例,展示了如何实现这一点

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()
protocol-NavBarResponder{}
类NavBarResponderController:UIViewController{}
扩展NavBarResponderController:NavBarResponder{}
var lastNavBarResponder:NavBarResponderController?=NavBarResponderController()
func设置(viewController:T),其中T:NavBarResponder{
印刷品(“作品”)
}
func重载ExtendedNavBar(){
如果让vc=lastNavBarResponder{
设置(viewController:vc)
}
}
重新加载ExtendedNavBar()

我怀疑错误是因为
UIViewController
不符合
NavBarResponder
,因此编译器无法保证
lastNavBarResponder
符合
设置的要求

尝试将
lastNavBarResponder
更改为符合
NavBarResponder
协议的
UIViewController
类型

下面是一个自包含的示例,展示了如何实现这一点

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()
protocol-NavBarResponder{}
类NavBarResponderController:UIViewController{}
扩展NavBarResponderController:NavBarResponder{}
var lastNavBarResponder:NavBarResponderController?=NavBarResponderController()
func设置(viewController:T),其中T:NavBarResponder{
印刷品(“作品”)
}
func重载ExtendedNavBar(){
如果让vc=lastNavBarResponder{
设置(viewController:vc)
}
}
重新加载ExtendedNavBar()

您使用的是哪种Swift版本?您使用的是哪种Swift版本?谢谢您的帮助!我尝试了这一点,但现在似乎我需要使当前为
UIViewController
的每个类都符合
NavBarResponder
这个新类,
NavBarResponderController
。否则我无法分配
lastNavBarRes思考
。还有其他方法吗?谢谢你的帮助!我尝试了这个方法,但现在似乎我需要使当前是
UIViewController
的每个类都符合
NavBarResponder
这个新类,
NavBarResponderController
。否则我无法分配
lastNavBarResponder
。还有其他方法吗?