Swift游乐场显示错误的语句执行次数(数组上的forEach)

亚伦

我一直在探索仿函数,但在了解forEach仿函数在幕后所做的工作时遇到了一些麻烦例如,当我将其输入游乐场时:

let array = [1] // [1]
array.forEach { $0.value } // (3 times)
array.forEach { _ in print("hello") } // (2 times)

当我展开(3 times)或时,(2 times)它只是显示()

例如,为什么在1个元素的数组上有多个执行,为什么两个forEach计算的执行次数不同?

抢马约夫

这是一个令人困惑的情况。

让我们考虑第二个forEach

array.forEach { _ in print("hello") } // (2 times)

该行的不同部分在不同的时间执行,Swift将这些时间中的每一次都计为一次单独的执行。第一次是在其调用时array.forEach,第二次是在其内部forEach执行到print匿名函数主体中的调用的时间。如果放入换行符,我们可以看到Swift只执行每行一次并报告其“值”:

array.forEach { _ in  // [1]
    print("hello")    // ()
}

我们也可以尝试将匿名函数放在变量中:

let p: (Int) -> () = { _ in print("hello") } // (2 times)
array.forEach(p)                             // [1]

在上面,Swift执行let p一次行的一部分以创建匿名函数并将其存储在中p,然后再执行该行的另一部分以print在函数主体内部进行调用

Swift报告该行的值print()因为forEachs参数必须是一个返回的函数()(空元组aka Void)。由于print已经返回(),因此Swift只需将其作为该行的值即可。

在回头考虑您的第一个forEach示例之前,让我们考虑另一个示例:

print("hello"); print("goodbye") // (2 times)

Swift说这行执行两次,因为该行上的每个单独的语句都算作一个单独的执行。

现在,让我们考虑您的第一个示例:

array.forEach { $0.value } // (3 times)

让我们尝试使用换行符:

array.forEach {  // [1]
    $0.value     // (2 times)
}

好的,因此forEach调用本身就算是一次执行。但是Swift声称它两次执行匿名函数的主体。为什么?

回想一下,forEach参数必须是返回的函数()但是类型$0.value不是(); 它是内部类型Builtin.Int64因此,Swift在该行的末尾插入另一个语句,以return ()实际上,Swift的行为就像您这样写:

array.forEach {    // [1]
    $0.value; ()   // (2 times)
}

我们可以通过向函数显式添加另一行来证明这一点:

array.forEach {  // [1]
    $0.value     // <<<opaque type>>>
    ()
}

现在,Swift认为每行都按预期执行一次。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么Swift游乐场显示的执行次数错误?

来自分类Dev

游乐场留言“次数”

来自分类Dev

游乐场执行失败:错误:无法查找符号

来自分类Dev

尝试在Swift游乐场中执行Xcode冻结?

来自分类Dev

随机功能游乐场Swift

来自分类Dev

游乐场执行终止,因为游乐场进程意外退出

来自分类Dev

iOS / tvOS游乐场失败,显示“无法找到所选运行目标的执行服务”

来自分类Dev

游乐场执行失败:<EXPR>:15:33:错误:类型'Int'不符合协议'BooleanType'

来自分类Dev

游乐场执行Int()类型转换失败

来自分类Dev

进入游乐场以显示所有循环结果

来自分类Dev

快速故障排除,在Xcode游乐场中显示数据?

来自分类Dev

斯威夫特游乐场结果位置错误

来自分类Dev

斯威夫特游乐场结果位置错误

来自分类Dev

如何在Swift游乐场中获得画布

来自分类Dev

Xcode 6 Beta / Swift-游乐场未更新

来自分类Dev

我如何在Swift游乐场看到异常?

来自分类Dev

Xcode 6 Beta / Swift-游乐场未更新

来自分类Dev

如何链接 swift 游乐场中的页面?

来自分类Dev

在 Swift 游乐场中更改实时视图的框架

来自分类Dev

RemoveAtIndex使游乐场崩溃

来自分类Dev

RemoveAtIndex使游乐场崩溃

来自分类Dev

快速布尔-游乐场

来自分类Dev

Objective-C的游乐场

来自分类Dev

斯威夫特游乐场打印括号

来自分类Dev

Java游乐场的Gradle任务

来自分类Dev

斯威夫特游乐场和LeetCode OJ

来自分类Dev

MongoDB $ group(Mongo游乐场)

来自分类Dev

斯威夫特游乐场和LeetCode OJ

来自分类Dev

斯威夫特游乐场图片未显示应有的内容