gpt4 book ai didi

Swift 3.0 闭包表达式 : what if the variadic parameters not at the last place in the parameters list?

转载 作者:行者123 更新时间:2023-11-28 08:27:52 24 4
gpt4 key购买 nike

2016.09.19更新

在闭包表达式参数列表中的一些其他参数之前使用可变参数有一个棘手的间接方法,哈哈

let testClosure = { (scores: Int...) -> (_ name: String) -> String in
return { name in
return "Happy"
}
}
let k = testClosure(1, 2, 3)("John")

而且我在 bugs.swift.org 中发现了一些相关问题: SR-2475 SR-494

原帖

根据document of Swift 3.0 ,对于闭包表达式,“如果您命名可变参数,则可以使用可变参数”(请参阅​​闭包表达式语法部分)。但是对于Swift 2.x,描述是“Variadic parameters can be used if you name the variadic parameter and place it last in the parameter list”,Swift 3.0文档中去掉了边框部分,这是否意味着可变参数可以是闭包表达式的参数,即使它不在最后一个地方?如果是,为什么下面的代码编译不成功?

let testClosure = { (scores: Int..., name: String) -> String in
return "Happy"
}
let k = testClosure(1, 2, 3, "John") // Missing argument for parameter #2 in call

如果参数标签可以在调用中使用,我认为编译器可以成功编译上面的代码,但在 Swift 3.0 中,闭包表达式的参数标签被认为是无关的。

此外,Swift 3.0 文档指出闭包表达式语法中的参数可以是in-out 参数,但是Swift 3.0 说闭包表达式语法可以使用常量参数、变量参数和inout 参数。为什么Apple去掉了常量参数、可变参数等描述,是因为在Swift 3.0中,参数不能是var吗?

非常感谢您的帮助!

最佳答案

仍然在 Swift3 中,可变参数必须是签名中的最后一个参数,因为尽管在您的情况下可以推断出最后一个类型为 String 的参数,但在某些情况下却不能,因为可变参数的无限扩展:

let foo = { (i:Int..., j: Int) -> Int  in
return j
}
foo(1,2)

...在 Swift 3.0 中,参数不能是 var?

var 参数在 Swift3 中被删除 SE-0003为了避免与 inout 参数混淆,因为 varinout 参数都可以在函数内部赋值,但只是 inout被反射回来。

 func doSomethingWithVar(var i: Int) {
i = 2 // change visible inside function.
}

func doSomethingWithInout(inout i: Int) {
i = 2 // change reflected back to caller.
}

从参数列表中删除var,消除上面的混淆。

关于Swift 3.0 闭包表达式 : what if the variadic parameters not at the last place in the parameters list?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39548852/

24 4 0