swift - 为什么将 void 分配给局部变量
问题描述
所以这实际上是可能的。
func clearItems() {
}
func reloadItems(_ clearItems: (() -> Void)? = nil) {
if let void = clearItems?() {
}
}
reloadItems(clearItems)
这应该是非法的吗?或者我们应该被迫使用 _ 而不是变量名?void 真的可以在这里以某种方式被消耗吗?
解决方案
是的,但是您需要将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.
}
推荐阅读
- oracle - 从 oracle 中的另外两个表的连接更新表的一列
- python - Python:将带有俄语字符的电子邮件保存到 TXT 文件
- javascript - 将 JSON 文件转换为 GEXF 文件
- sql - 表访问 rowid 在此查询中不起作用
- api-management - API 管理中的 Azure Application Insights - 它是否记录后端 api 中记录的信息
- react-native - React Native如何像QR码标记一样只在正方形的角落制作边框
- jstree - 带有 jstree-3.3.7/jstree.min.js 的 JavaScript +c+ 无效链接警告
- java - 如何从方法中获取一个名为 token 的字符串值,以便使用 Spring AOP 编写更短的代码
- c++ - 尝试在 CLion 中使用 Boost 和 CMake
- c - 在 c 编程中固定制表