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
isnil
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)
}