所以这实际上是可能的。
func clearItems() {
}
func reloadItems(_ clearItems: (() -> Void)? = nil) {
if let void = clearItems?() {
}
}
reloadItems(clearItems)
这是非法的吗?还是应该强制使用变量名的_ intead?真的可以在这里以某种方式消耗虚空吗?
答案 0 :(得分:0)
是的,但是您需要更改reloadItems
方法,使其看起来像这样:
func reloadItems(_ clearItems: (() -> Void)? = nil) {
if let void = clearItems {
void() // Call void.
}
}
通过说clearItems?()
,您正在调用传递的函数,这不是您想要执行的操作。您想安全地解包传递的函数,因此需要像上面的代码片段一样将其视为传递的变量。
如果您不使用if let
语句,则可以这样调用clearItems
:
clearItems?()
如果不是nil
,它将调用传递的函数,如果不是nil
,则将不执行任何操作。
因此您的reloadItems
函数可以变得像这样:
func reloadItems(_ clearItems: (() -> Void)? = nil) {
clearItems?() // This will call the passed function if it isn't nil, and will do nothing if it is nil.
}
答案 1 :(得分:0)
Void是Swift中的一种类型,与其他任何类型一样。几乎不需要传递它,但这不会改变该语言支持将其返回并存储在常量中的事实。
无论如何,这都是隐式发生的,只是您是明确的。如果您希望return ()
位于每个不返回值的函数的末尾,因为()
表示Void的一个实例。不过,编译器会为您执行此操作,因此您无需这样做。