一尘不染

为什么速记参数名$ 0返回所有参数的元组?

swift

我试图定义一个可以容纳闭包的变量,并且使用Swift的速记参数名称遇到了一些困难。采取以下代码段:

var returnAString: (String, String) -> String
returnAString = { return $0 }

这给了我编译错误 ‘(String,String)’无法转换为’String’
。当我修改闭包时,返回带有第一个参数值的字符串,我将两个参数值都返回到一个元组中。

println(returnAString("1", "2")) // Prints "(1, 2)"

但是,如果我修改闭包以打印第二个参数,则会按预期打印正确的参数。

returnAString = { $1 }
println(returnAString("1", "2")) // Prints "2"

我感觉自己在这里做些愚蠢的事情,但是我找不到任何解释为什么会发生这种情况。


阅读 220

收藏
2020-07-07

共1个答案

一尘不染

闭包§速记参数名称

速记参数名称

…速记参数名称的数量和类型将从预期的函数类型中推断出来。

看起来这是预期的行为。通过仅提供$0(至少是向系统)推断您想要元组。

这似乎只是使用的一种特殊情况$0。例如,以下内容无法编译。

var returnAString3: (String, String, String) -> String
returnAString3 = { return $1 }

无论如何修改。

returnAString3 = { return $1.0 } // still fails.
2020-07-07