Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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_Closures - Fatal编程技术网

Swift 无法调用非函数类型的值';闭包名称';

Swift 无法调用非函数类型的值';闭包名称';,swift,closures,Swift,Closures,我定义了一个名为touchBlock的闭包,并在override func touchesend中使用它,然后我得到一个错误: 无法调用非函数类型“”的值((ELControl、UIEvent、UIEvent) ->空虚?) 这是我的密码: var touchBlock: ((_ view: ELControl, _ touches: UIEvent, _ event: UIEvent) -> Void?)? override func touchesEnded(_ touches

我定义了一个名为
touchBlock
的闭包,并在
override func touchesend
中使用它,然后我得到一个错误:

无法调用非函数类型“”的值((ELControl、UIEvent、UIEvent) ->空虚?)

这是我的密码:

var touchBlock: ((_ view: ELControl, _ touches: UIEvent, _ event: UIEvent) -> Void?)?    
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {

    if self.touchBlock != nil {

        self.touchBlock(nil, touches, event)
    } else {

        super.touchesEnded(touches, with: event)
    }
}
var touchBlock:((u视图:ELControl,u触摸:UIEvent,uevent:UIEvent)->Void?)?
覆盖函数touchesend(touchs:Set,带有事件:UIEvent?){
如果self.touchBlock!=nil{
self.touchBlock(无、触摸、事件)
}否则{
super.touchesend(触摸,带有:事件)
}
}

请帮助我修复它。

您需要首先打开闭包变量。例如,您可以使用可选的链接语法(注意
if语句中
self.touchBlock
之后出现的问号

var touchBlock:((u视图:ELControl,u触摸:UIEvent,uevent:UIEvent)->Void?)?
覆盖函数touchesend(touchs:Set,带有事件:UIEvent?){
如果self.touchBlock!=nil{
self.touchBlock?(无、触摸、事件)
}否则{
super.touchesend(触摸,带有:事件)
}
}

您必须打开可选的

self.touchBlock!(nil, touches, event)
或者最好是可选绑定

if let block = self.touchBlock {
   block(nil, touches, event) ...

但认为传递的参数根本不符合闭包的类型(<代码>视图<代码> > <代码>事件>代码>是非可选的,<>代码>触碰完全不同。

< P> <强>在代码中有2种情况需要处理。<强> < /P>
var touchBlock: ((_ view: ELControl, _ touches: UIEvent, _ event: UIEvent) -> Void?)?   
块定义显示只能将非nil值传递给块,甚至块也是可选的。因此,@Igor建议将该块称为:

self.touchBlock?(<non-nil-value>, touches, event) 
但是,如果您也想传递nil值,请将块定义为:

//将
ELControl
视图设置为带有
标记的
可选

var touchBlock: ((_ view: ELControl?, _ touches: UIEvent, _ event: UIEvent) -> Void?)?   
并致电:

if let block = self.touchBlock {
    block(nil, touches, event)
} else {
    super.touchesEnded(touches, with: event)
}

可选链接实际上是毫无意义的,因为您刚刚检查了
touchBlock
不是
nil
。不同意您的看法。如果让…
展开和块创新,则等于
。更好的是,as提供了更短、可读性更好的语法。是的,但您要检查两次,第一个对象!=
nil
然后使用冗余的可选链接。应该接受,如果存在
else
分支,
if let
语法可能是最好的。但这种变异仍然是可能的。变量展开的思想对于问题提出的方式至关重要1)尽量避免显式展开optionals-因为如果变量偶尔被设计为
nil
is
nil
2)optionals链提供了更好的表达“优选方式”的方式可选链接是完美的独立链接,但在这种情况下,前面的检查显示该块确实有一个值,可以100%安全地展开。
var touchBlock: ((_ view: ELControl?, _ touches: UIEvent, _ event: UIEvent) -> Void?)?   
if let block = self.touchBlock {
    block(nil, touches, event)
} else {
    super.touchesEnded(touches, with: event)
}