我试图创建一个我可以输入参数但没有返回的块(类型块无效)。我们知道没有参数但没有返回任何内容的块的结构是这样的:
var block: () -> () = {
//Hello World goes here
}
对于带参数的块,但不返回任何内容,我们可以使用此命令:
var bloco7: (String) -> () = {
//Hello World goes here
}
但是我们有两个问题:第一个是这个代码不起作用,第二个是这个代码只有在我们调用这样的临时变量时才有效:
var bloco7: (String) -> () = {
$0//I only need to call
//Hello World goes here and all the things OK
}
我想知道为什么会这样,这似乎没有多大意义......
答案 0 :(得分:1)
首先,你需要像tis
那样做var bloco7: (String) -> () = {
input in
//Do something with input
}
bloco7
类型为:(String)->()
{}
类型为:() -> ()
它们不匹配,因此您收到错误
但是在第二种方式中,你使用$ 0,swift知道它有一个输入,它会匹配.Match $ 0到输入String
,所以类型是对的
答案 1 :(得分:1)
这里有两个部分。
首先,我们声明闭包的类型:
var bloco7: (String) -> ()
bloco7
是一个类型为(String) -> ()
的变量(一个带有字符串并返回nil
的闭包。我们不在这里定义参数的名称。参数由"闭包文字语法" so-to-speak。
所以,如果我们想要一个内联闭包,我们可以稍后:
var bloco7: (String) -> () = {
yourArgument in // <-- here we named the parameter, it's called 'yourArgument'
println(yourArgument)
}
但重要的是要注意,当我们声明bloco7
及其类型时,我们不能定义变量的名称。请记住,我们可以为闭包变量分配方法和函数。
例如,给定此功能:
func sayHello(name: String) -> Void {
println("Hello, " + name + "!")
}
我们实际上可以bloco7
指向此功能:
bloco7 = sayHello
现在,以下两行实际上完全相同:
sayHello("World")
bloco7("World")
这里重要的一点是,参数名称与闭包类型无关。参数名称是我们赋给变量的值的一部分,而不是其类型的一部分。