我试图定义一个可以容纳闭包的变量,并且使用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"
我感觉自己在这里做些愚蠢的事情,但是我找不到任何解释为什么会发生这种情况。
闭包§速记参数名称
速记参数名称 …速记参数名称的数量和类型将从预期的函数类型中推断出来。
…速记参数名称的数量和类型将从预期的函数类型中推断出来。
看起来这是预期的行为。通过仅提供$0(至少是向系统)推断您想要元组。
$0
这似乎只是使用的一种特殊情况$0。例如,以下内容无法编译。
var returnAString3: (String, String, String) -> String returnAString3 = { return $1 }
无论如何修改。
returnAString3 = { return $1.0 } // still fails.