Macos 理解枚举和函数签名
在学习Swift时,我遇到了以下代码:-Macos 理解枚举和函数签名,macos,swift,Macos,Swift,在学习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 ServerRespon
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 = {
...
}()
没有括号,游乐场将产生错误:-
函数生成预期的类型“ServerResponse”;你想用()来称呼它吗
考虑到函数具有以下特征:-
函数名称(参数)->returnType
有人能解释一下为什么这里需要括号吗?它是一种最小化闭包形式还是其他形式?它是一个匿名函数/lambda/closure(不过您希望准确地调用它),不带任何参数,其返回类型由编译器推断,然后立即调用。它类似于JavaScript中的
(function(){…})(
)
它的最大优点是允许您将mySuccess
定义为常量而不是变量。此外,它还创建了一个作用域,使得中间变量(如zeroOrOne
)在外部不可见
我想知道的是,为什么这段代码的作者没有使用相同的风格来定义和分配
serverResponse
。您的serverResponse
不是一个函数,它是一个enum
,但是如果没有括号,您试图分配给mySuccess
的块就是一个函数(返回一个ServerResponse
),因此不能分配给ServerResponse
。调用函数的结果(添加括号)可以。谢谢Jean Phillipe。既然闭包可以访问自己范围之外的变量,那么这里是否需要传递参数呢?对于使用相同样式的代码的作者来说,答案来自这里:确实,不需要参数,因为闭包内的代码将自动捕获引用的所有内容来自外部世界。它有效地充当本地作用域。感谢您的解释。现在这更清楚了;O)我知道ServerResponse不是一个函数。我明白你在说什么;使用括号可以确保闭包被执行,而不是编译器将其解释为被分配给LHS变量。