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:将类方法作为函数参数传递(而不是泛型函数)_Swift_Uiviewcontroller_Function Parameter - Fatal编程技术网

Swift:将类方法作为函数参数传递(而不是泛型函数)

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 {

我试图从popover视图控制器调用根视图控制器上的函数。下面的功能可以工作,但似乎应该有更好的方法:

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
。对于这样的签出委派模式,我们最好使用计算属性而不是函数