为什么将void分配给局部变量

时间:2018-08-19 21:49:02

标签: swift syntax

所以这实际上是可能的。

func clearItems() {
}

func reloadItems(_ clearItems: (() -> Void)? = nil) {
    if let void = clearItems?() {

    }
}

reloadItems(clearItems)

这是非法的吗?还是应该强制使用变量名的_ intead?真的可以在这里以某种方式消耗虚空吗?

2 个答案:

答案 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的一个实例。不过,编译器会为您执行此操作,因此您无需这样做。