了解枚举和函数签名

时间:2015-02-02 10:03:25

标签: 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 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会产生错误: -

  

功能产生预期类型' ServerResponse&#39 ;;你的意思是用()来打电话吗?

考虑一个函数有签名: -

  

func name(param) - >返回类型

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

2 个答案:

答案 0 :(得分:2)

它是一个匿名函数/ lambda / closure(但是你想要完全调用它),不带参数,其返回类型由编译器推断,然后立即调用。它与JavaScript中的(function() {…})()类似。

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

我想知道的是为什么此代码的作者没有使用相同的样式来定义和分配serverResponse ...

答案 1 :(得分:2)

您的ServerResponse不是函数,它是enum,但如果没有括号,您尝试分配给mySuccess的块是一个函数(返回ServerResponse 1}}),因此无法分配给ServerResponse。调用函数(添加括号)的结果可以是。