字符串不是()的子类型

时间:2015-06-06 01:15:15

标签: ios swift

我试图创建一个我可以输入参数但没有返回的块(类型块无效)。我们知道没有参数但没有返回任何内容的块的结构是这样的:

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
}

我想知道为什么会这样,这似乎没有多大意义......

2 个答案:

答案 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")

这里重要的一点是,参数名称与闭包类型无关。参数名称是我们赋给变量的值的一部分,而不是其类型的一部分。