Swift Closure编译错误
问题描述:
我是swift的初学者。Swift Closure编译错误
下面的代码没有任何编译错误
var test = { //no error
return "String"
}
而如果我添加一个字符串类型的变量测试,如下图所示,编译器会引发错误“功能产生预期的字符串类型。您的意思是有()”
var test:String = { // error
return "String"
}
据我所知,SWIFT能够类型推断的调用它。有人可以解释为什么上面的代码抛出编译错误,其中第一个没有。
谢谢
答
在你的第一个例子,雨燕正确地使用类型推理来推断出你的闭包作为一个零-argument(Void
/空的元组()
)闭合带返回值String
:() -> String
var test = {
return "String"
}
print(test.dynamicType) //() -> String
而在第二个示例中,您明确指定类型的test
为String
,这意味着尝试将() -> String
类型的闭包分配给它将是类型不匹配。
原因雨燕问你,如果你想打电话盖子与()
是,你实际上可以通话关闭单个时间(就像你调用一个函数引用函数的参数列表(...)
) ,使用闭包的返回值(即String
)为您的test
变量(其类型为String
)分配一个初始值。
var test2: String = {
return "String"
}() // ok! assign "String" to test2
答
您尝试将闭包分配给字符串变量。
如果你想作为一个返回字符串块明确键入您的变量,请
var test:() -> String = {
return "String"
}
如果你想关闭立即返回字符串,并将其分配给一个字符串变量,执行关闭
var test:String = {
return "String"
}()
答
在第一个例子中test
有() -> String
类型,而不是String
。为了让String
你需要调用关闭:
var test = {
return "String"
}()
与第二个同样的事情:
var test: String = {
return "String"
}() // test is now String
请注意,您可以在Xcode上点击一个变量来查看它的类型 - 看看Swift推断它是什么。你会在第一个例子中看到'test'是'() - > String',而不是'String'。 – Hamish