我是swift的初学者。
以下代码没有任何编译错误
var test = { //no error
return "String"
}
然而,如果我将类型String添加到变量test中,如下所示,编译器会抛出错误“Function产生预期类型字符串。你的意思是用()调用它”
var test:String = { // error
return "String"
}
据我所知,swift能够进行类型推断。有人可以解释为什么上面的代码抛出编译错误,而第一个没有。
由于
答案 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"
}()