Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 为什么速记参数名$0返回所有参数的元组?_Swift - Fatal编程技术网

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

Swift 为什么速记参数名$0返回所有参数的元组?,swift,Swift,我试图定义一个可以保存闭包的变量,但在使用Swift的速记参数名时遇到了一些困难。以以下代码段为例: var returnAString: (String, String) -> String returnAString = { return $0 } 这给了我编译错误“(String,String)”不能转换为“String”。当我修改闭包返回一个带有第一个参数值的字符串时,我会在元组中返回两个参数值 println(returnAString("1", "2")) // Prints

我试图定义一个可以保存闭包的变量,但在使用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"

我觉得我在做一些有点傻的事情,但我找不到任何解释来解释为什么会发生这种情况。

Type inferral将
$0
视为元组而不是第一个参数,因为您没有使用第二个参数

如果只引用第二个参数,则它可以正常工作:

returnAString = { $1; return $0 }
我所说的是正确的证据来自0x7fffffff的评论:

returnAString = { $0.0 }
这意味着取
$0
元组的第一个值并返回它。

速记参数名 … 将根据预期的函数类型推断速记参数名称的数量和类型

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

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

var returnAString3: (String, String, String) -> String
returnAString3 = { return $1 }
不管怎么修改

returnAString3 = { return $1.0 } // still fails.

对于该语言,“多个参数”与作为元组的单个参数相同。由于只使用了
$0
,而不是
$1
等,编译器首先猜测只有一个参数。这种猜测总是有效的,因为任何函数类型都可以被视为只有一个参数(可能是
Void
,一个元组,或者其他)。

$0.0
可以让它工作,尽管据我所知,它应该按照您尝试的方式工作(或者至少看起来应该是这样)。这是一种违反直觉的行为。现在我的脸看起来完全像
$0.0
。请注意,在Swift 4中,此行为将根据发生变化–具有n个参数的函数类型只能由具有n个参数的函数值满足(因此,我相信您无法使用速记闭包参数隐式忽略参数–您必须在正文中同时使用
$0
$1
,或者明确忽略其中一个或两个参数)。看起来你是对的。如果我在变量定义中命名参数,那么我实际上可以像这样访问它们,$0.param1,$0.param2。但是,只要我引用$1,$0就变成了字符串类型,不再编译。这很有意义。但看起来不是很直观!