Swift Closure编译错误

时间:2016-06-09 18:20:02

标签: swift

我是swift的初学者。

以下代码没有任何编译错误

var test  =  { //no error
  return "String"
}

然而,如果我将类型String添加到变量test中,如下所示,编译器会抛出错误“Function产生预期类型字符串。你的意思是用()调用它”

var test:String  =  { // error
    return "String"
}

据我所知,swift能够进行类型推断。有人可以解释为什么上面的代码抛出编译错误,而第一个没有。

由于

3 个答案:

答案 0 :(得分:3)

在第一个示例中,Swift正确使用类型推断将闭包推断为零参数(String /空元组() -> String)闭包,返回值为var test = { return "String" } print(test.dynamicType) // () -> String :{{1 }}

test

在第二个示例中,您明确指定String类型() -> String,这意味着尝试分配类型()的闭包这将是一种类型不匹配。

Swift问你是否想要用(...)来调用闭包的原因是你实际上可以一次调用闭包(很像你用一个函数调用一个函数)函数引用一个参数列表String),使用闭包的返回值(test)为您的String变量赋予一个初始值(就是这样,输入var test2: String = { return "String" }() // ok! assign "String" to test2 )。

{{1}}

答案 1 :(得分:2)

在第一个示例test中有() -> String类型,而不是String。要使它String,你需要调用闭包:

var test = {
    return "String"
}()

与第二个相同:

var test: String  =  {
    return "String"
}() // test is now String

答案 2 :(得分:0)

您尝试为字符串变量分配闭包。

如果要显式键入变量作为返回字符串的块,请执行

var test: () -> String  =  {
    return "String"
}

如果希望闭包返回字符串并将其分配给字符串变量,请立即执行闭包

var test:String  =  {
    return "String"
}()