在学习 Swift 的过程中,我遇到了这段代码:-
enum ServerResponse {
case Result(String, String)
case Error(String)
}
for i in 1...10{
let mySuccess: ServerResponse = {
let zeroOrOne = rand() % 2
if zeroOrOne == 0 {
return ServerResponse.Result("7:00 am", "8.09 pm")
} else {
return ServerResponse.Error("Out of cheese.")
}
}()
var serverResponse: String
switch mySuccess {
case let .Result(sunrise, sunset):
serverResponse = "Sunrise is at \(sunrise) and sunset as \(sunset)"
case let .Error(error):
serverResponse = "Failure... \(error)"
}
println(serverResponse)
}
从这里可以看出,在声明的右大括号之后有小括号():
let mySuccess: ServerResponse = {
...
}()
没有括号,playground 会产生错误:-
Function produces expected type 'ServerResponse'; did you mean to call it with ()?
考虑一个函数有签名:-
func name(param) -> returnType
有人可以解释一下为什么这里需要括号吗?它是一种最小化闭包形式,还是其他形式?
最佳答案
它是一个匿名函数/lambda/闭包(但是你想准确地调用它),不带参数,其返回类型由编译器推断,然后立即调用。它类似于 JavaScript 中的 (function() {…})()
。
它的一大优势是允许您将 mySuccess
定义为常量而不是变量。此外,它还创建了一个作用域,这样中间变量(如 zeroOrOne
)在外部是不可见的。
我想知道的是为什么这段代码的作者没有使用相同的风格来定义和分配serverResponse
…
关于macos - 了解枚举和函数签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28275126/