Swift:将类方法作为函数参数传递(而不是泛型函数)
我试图从popover视图控制器调用根视图控制器上的函数。下面的功能可以工作,但似乎应该有更好的方法:Swift:将类方法作为函数参数传递(而不是泛型函数),swift,uiviewcontroller,function-parameter,Swift,Uiviewcontroller,Function Parameter,我试图从popover视图控制器调用根视图控制器上的函数。下面的功能可以工作,但似乎应该有更好的方法: func doSomethingInRoot() { if let appDelegate = UIApplication.shared.delegate as? AppDelegate, let currentRoot = appDelegate.window!.rootViewController as? RootViewController {
func doSomethingInRoot() {
if let appDelegate = UIApplication.shared.delegate as? AppDelegate,
let currentRoot = appDelegate.window!.rootViewController as? RootViewController {
currentRoot.somefunction()
}
}
在上面的代码中,doSomethingInRoot
将包含在popover中,someFunction
将是RootViewController
的一个函数
我正在寻找的是一种将someFunction
传递给另一个包含上述if let
的函数的方法,然而,问题是currentRoot
仅被指定为上述函数中的RootViewController
(即,doSomethingRoot
不知道传递给它的是RootViewController
的方法,而不是泛型函数)
在写这个问题时,我意识到我可以做下面的事情,这感觉很清楚,但我仍然好奇是否可以将方法作为参数传递给特定的类
func doSomethingInRoot() {
if let root = getRoot() {
root.someFunction()
}
}
func getRoot() -> RootViewController? {
if let appDelegate = UIApplication.shared.delegate as? AppDelegate,
let currentRoot = appDelegate.window!.rootViewController as? RootViewController {
return currentRoot
} else {
return nil
}
}
在popover视图控制器中,可以添加这样的属性来保存对someFunction的引用
var rootsSomeFunction: (()->Void)!
然后在创建popover VC时分配引用,无论它是在prepareforsgue
中,还是在从故事板实例化if之后……等等。我还将getRoot()
移动到应用程序委托
popoverVC.rootsSomeFunction = appDelegate.getRoot().someFunction().self
最后,在popover视图控制器中,您可以通过如下属性调用它:
self.rootsSomeFunction()
顺便说一句,getRoot可以实现为
return(UIApplication.shared.delegate作为?AppDelegate)?.window?.rootViewController作为?rootViewController
。对于这样的签出委派模式,我们最好使用计算属性而不是函数