如何使用Swift从内部函数中退出函数作用域?

时间:2017-11-12 16:51:31

标签: swift function scope

使用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")
}

1 个答案:

答案 0 :(得分:3)

这基本上是Swift的错误处理方式:

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

struct DoNotContinue : Error {}

func inner() throws
{
    throw DoNotContinue()
}

do { try outer() }
catch _ { print("Skipped the unreachable") }

当然,请注意,调用者仍然可以控制它:它可以捕获抛出的错误本身,而不仅仅是退出。

  

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

允许被调用者直接退出调用者是一个更严重的问题,那就是控制流非常很快变得难以理解。想象一下,你有几层这样的。阅读顶级功能,您不再清楚可能会发生什么。您必须自己进入每个被调用者的被调用者,以确保原始代码将继续进行。