macos - 了解枚举和函数签名

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

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/

相关文章:

ios - 具有一个参数/参数的泛型类的泛型类

macos - 适用于 Python 的 Google App Engine SDK 未在 Mac 上安装

cocoa - 层托管 NSView 的调整大小问题

swift - 非可选 IBOutlet 返回 fatal error : when referenced from another UIViewController class

swift - 更改了哪个日历(使用 EKEventStoreChangedNotification?)

xcode - UITableView 动态分组单元格

swift - 如何为 swift 包中的所有测试调用全局设置?

macos - DocumentType 不使用 Swift 在 Xcode 6 Beta 5 中映射

java - 如何在 mac 上运行 sonarqube?

ios - 生成随机字符串后的奇怪返回值(Swift 3)