Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.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_Swift3 - Fatal编程技术网

是否可以在Swift中将空函数声明为变量?

是否可以在Swift中将空函数声明为变量?,swift,swift3,Swift,Swift3,有没有可能这样做,并创建一个空函数,以后可以分配,因为我不断得到一个错误,我不能调用分配的函数,这是我得到的最接近的一个 fileprivate class actionButton: UIButton{ var functo = () func tapped(functoCall: () ->Void){ self.functo() } } 此按钮在函数中初始化,该函数将函数作为参数,并将其传递给此按钮,此按钮是上述指定类的后代 butt

有没有可能这样做,并创建一个空函数,以后可以分配,因为我不断得到一个错误,我不能调用分配的函数,这是我得到的最接近的一个

fileprivate class actionButton: UIButton{
    var functo = ()
    func tapped(functoCall: () ->Void){
        self.functo()
    }
}
此按钮在函数中初始化,该函数将函数作为参数,并将其传递给此按钮,此按钮是上述指定类的后代

    button.functo = funcToCall()
    button.addTarget(self, action: #selector(yes.tapped(functoCall:)), for: .touchDown)
我遇到的问题是,当我尝试调用self.functo()时,我无法调用非函数类型,这是可能的

出现错误的原因是编译器无法知道
functo
实际上是一个可调用的函数。您隐式地将其设置为
Any

您只需首先将其强制转换为所需类型的函数(例如,使用
if let

像这样的事情应该让你开始:

var myfunc: Any = ()

func test() -> String {
    return "Cool"
}
// Assign any function to myfunc
myfunc = test

// Just cast it to the expected type
if let x = myfunc as? ()->String {
    x()
}
如果这个问题只是这个问题的一个特例(正如一个向下投票人所认为的那样),您只需键入带有函数签名的变量即可。这是一个微不足道的例子:

var myfunc: ((Any) -> Void)? = nil

然后,当您分配它时,它是可调用的。

您通常只需将
functo
定义为闭包,因为它还没有任何内容,所以它将是可选的,例如
var functo:(()->Void)?
。或者,如果您不需要告诉它是否为
nil
,您可以给它一个不做任何事情的函数的默认值,例如
var funco={}
(它将被推断为
()->Void
),而不是将
myfunc
定义为
Any
,您应该使用示例将其声明为
()->String
。这样,就不需要强制转换。我的示例是人为的。如果您知道签名upfornt,当然可以将函数存储在这样一个类型化变量中。我的印象不是这个问题。我的示例应该说明,可以将任意函数存储在变量中,然后调用它。