Swift Closure编译错误

问题描述:

我是swift的初学者。Swift Closure编译错误

下面的代码没有任何编译错误

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

而如果我添加一个字符串类型的变量测试,如下图所示,编译器会引发错误“功能产生预期的字符串类型。您的意思是有()”

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

据我所知,SWIFT能够类型推断的调用它。有人可以解释为什么上面的代码抛出编译错误,其中第一个没有。

谢谢

+1

请注意,您可以在Xcode上点击一个变量来查看它的类型 - 看看Swift推断它是什么。你会在第一个例子中看到'test'是'() - > String',而不是'String'。 – Hamish

在你的第一个例子,雨燕正确地使用类型推理来推断出你的闭包作为一个零-argument(Void /空的元组())闭合带返回值String() -> String

var test = { 
    return "String" 
} 

print(test.dynamicType) //() -> String 

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

原因雨燕问你,如果你想打电话盖子与()是,你实际上可以通话关闭单个时间(就像你调用一个函数引用函数的参数列表(...)) ,使用闭包的返回值(即String)为您的test变量(其类型为String)分配一个初始值。

var test2: String = { 
    return "String" 
}() // ok! assign "String" to test2 
+0

@ originaluser2谢谢! – dfri

+0

没问题@dfri :) – Hamish

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

如果你想作为一个返回字符串块明确键入您的变量,请

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