如何使用Swift从内部函数退出函数范围?

如何使用Swift从内部函数退出函数范围?,swift,function,scope,Swift,Function,Scope,使用return可以退出当前函数的作用域,但也可以退出调用内部函数的外部函数的作用域吗 func innerFunction() { guard 1 == 2 else { // exit scope of innerFunction and outerFunction } } func outerFunction() { innerFunction() print("should be unreachable") } 可能有一种方法使用内部函数的返回值,我们可以检查

使用
return
可以退出当前函数的作用域,但也可以退出调用内部函数的外部函数的作用域吗

func innerFunction() {
  guard 1 == 2 else {
    // exit scope of innerFunction and outerFunction
  }
}

func outerFunction() {
  innerFunction()
  print("should be unreachable")
}
可能有一种方法使用内部函数的返回值,我们可以检查:

func innerFunction() -> Bool {
  guard 1 == 2 else {
    return false
  }
  return true
}

func outerFunction() {
  guard innerFunction() else {
    return
  }
  print("should be unreachable")
}
这种方法的问题是,如果函数变得更加复杂,并且您必须反复使用它们,那么它会很快使代码变得混乱

考虑将此方法应用于
XCTest
。它看起来是这样的:

func testFoobar() {
  guard let unwrappedObject = helperFunction() else {
    XCTFail("A failure message that can change with each helperFunction call")
    return
  }
  print("should be unreachable when helperFunction already failed")
}
我想要类似的东西:

func testFoobar() {
  let unwrappedObject = helperFunction()
  print("should be unreachable when helperFunction already failed")
}

这就是Swift错误处理的基本功能:

func outer() throws
{
    try inner()
    print("Unreachable")
}

struct DoNotContinue : Error {}

func inner() throws
{
    throw DoNotContinue()
}

do { try outer() }
catch _ { print("Skipped the unreachable") }
当然,请注意,调用方仍然可以控制这一点:它可以捕获抛出的错误本身,而不是仅仅退出

这种方法的问题在于它会使代码变得混乱


允许被调用者直接退出其调用者有一个更严重的问题,那就是控制流很快就会变得不可理解。想象一下,你有两层这个。阅读顶级函数,您不再清楚会发生什么。您必须自己递归到每个被调用者的被调用者中,以确保原始代码将继续其过程。

的可能重复。如果他们不希望人们将其称为例外,他们就不应该使用糟糕的
try
-
catch
语法。:)我同意围绕Swift错误选择关键词是不幸的,但我们不要传播误解。你知道他们怎么说“在罗马的时候……”,对吧?在使用它的编程语言的上下文中,我也将
%
称为“modulo”,尽管历史和常识都说它通常是“百分比”。