了解枚举和函数签名

Understanding enum and function signature

在学习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

有人可以解释一下为什么这里需要括号吗?它是一种最小化闭包形式,还是其他形式?

它是一个匿名的 function/lambda/closure(但是你想准确地称呼它),不带任何参数,其 return 类型由编译器推断,然后立即调用。它类似于 JavaScript 中的 (function() {…})()

它的一大优势是允许您将 mySuccess 定义为常量而不是变量。此外,它创建了一个范围,这样中间变量(如 zeroOrOne)在外部不可见。

我想知道的是为什么这段代码的作者没有使用相同的风格来定义和分配serverResponse

您的 ServerResponse 不是一个函数,它是一个 enum,但是如果没有括号,您将尝试分配给 mySuccess 的块是一个函数(即 returnsaServerResponse),因此不能赋值给aServerResponse。调用函数(加上括号)的结果可以是。