【问题标题】:confused with the functionality of `return` in swift与 swift 中的“return”功能混淆
【发布时间】:2017-09-26 01:29:01
【问题描述】:

我对 Swift 中的 return 感到困惑。我知道它用于返回函数中的值,如果这样使用:

func double(value: int) -> Int { 
    return value * 2
}

但我经常只看到 return 被使用,就像在这样的可选绑定中的 guard 语句中:

guard let value = value else (
    print ("nothing")
    return
}

那么像这样在guard 语句中只包含return 的目的是什么?实际上,在展开可选值时,我经常不仅在 guard 语句中看到这一点。当我想使用字典中的可选字符串时,我在编写代码时总是会发现这个问题。

let info = ["name": "sarah", "hometown": "sydney"]

class UserInfo {

    func getTheName() -> String {
        guard let name = info["name"] else { return }

        return name
    }
}
// Compile time error: "Non-void function should return a value"

即使我写了return name,我也会收到此错误。 Xcode 仍然抱怨我没有返回值。是因为guard语句中的return吗?

那么,你能告诉我return 在 Swift 中的用途吗?这让我很困惑。

【问题讨论】:

  • 对于guard 语句,let 语句的范围在块之外,因此您不能在else 块内使用它。

标签: ios swift return


【解决方案1】:

return 不带任何参数返回Void。这种形式的return 语句只能与返回Void 的函数一起使用。

一旦return 语句执行,函数就会退出并且你的函数中不再有代码执行。由于您在guard 语句中有return,因此第二个return name 将不会被执行(它无论如何都不能执行,因为它没有要返回的名称),这就是您收到编译器错误的原因;编译器会查看您的函数可以用来返回某些内容的所有路径,并确保所有这些路径都返回函数签名所说的内容。

您问题中的函数声明它返回String,因此您不能在guard 语句中简单地说return,因为它返回Void,这违反了您的函数签名所表达的合同。

你可以返回一个不是Void的默认值:

func getTheName () -> String {
    guard let name = info["name"] else {
        return ""
    }
    return name
}    

使用 nil-coalescing 运算符 可以更简洁地编写它; return info["name"] ?? ""

您还可以在返回 Void 的函数中使用 return(或没有显式返回类型,在这种情况下,它被隐式理解为返回 Void)

所以你可以有这样的功能:

func maybePrint(theMessage: String?) -> Void {
    guard let msg = theMessage else {
        return
    }
    print(msg)
}

【讨论】:

  • nil 或 Void 都与“无”相同。 "nothing" 在 Swift 中具有非常特殊的含义,Nothing 类型。正确地说,这些函数返回()(又名Void,Void 类型的唯一实例)
  • 其实这是不正确的;您需要显式返回nil 作为可选;我已经更新了我的答案。谢谢
【解决方案2】:

你在正确的轨道上。

在 getTheName() 中的保护语句中,如果保护失败,'return' 关键字将尝试退出函数本身。但是该函数要求您返回一个字符串,因此您会收到编译器错误。

这是对类似问题的另一个 SO 答案的一部分:

guard 使用控制转移语句强制您退出范围。 您可以使用 4 个:

return 和 throw 都 exit 可以使用函数/方法 continue 循环内 (while/for/repeat-while) 可以在循环中使用 break (while/for/repeat-while) 退出直接作用域。指定一个 要中断的标签将允许您一次退出多个范围(例如 打破嵌套循环结构)。使用标签时,break 可以 也可用于 if 范围。此外,您可以通过以下方式退出范围 调用一个返回 Never 的函数,例如 fatalError。

Stack Overflow: If the Swift 'guard' statement must exit scope, what is the definition of scope?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    相关资源
    最近更新 更多