Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 理解枚举和函数签名_Macos_Swift - Fatal编程技术网

Macos 理解枚举和函数签名

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

在学习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 = {
  ...
}()
没有括号,游乐场将产生错误:-

函数生成预期的类型“ServerResponse”;你想用()来称呼它吗

考虑到函数具有以下特征:-

函数名称(参数)->returnType


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

它是一个匿名函数/lambda/closure(不过您希望准确地调用它),不带任何参数,其返回类型由编译器推断,然后立即调用。它类似于JavaScript中的
(function(){…})(

它的最大优点是允许您将
mySuccess
定义为常量而不是变量。此外,它还创建了一个作用域,使得中间变量(如
zeroOrOne
)在外部不可见


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

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

谢谢Jean Phillipe。既然闭包可以访问自己范围之外的变量,那么这里是否需要传递参数呢?对于使用相同样式的代码的作者来说,答案来自这里:确实,不需要参数,因为闭包内的代码将自动捕获引用的所有内容来自外部世界。它有效地充当本地作用域。感谢您的解释。现在这更清楚了;O)我知道ServerResponse不是一个函数。我明白你在说什么;使用括号可以确保闭包被执行,而不是编译器将其解释为被分配给LHS变量。