Switch Case handling two different scenarios

Viewed 92

I have the following implementation where potentially I could able to get two different error types as CustomError and ClassError.

However if I receive a ClassError, it goes into switch statement of CustomError's default case. I am wondering how to handle this scenario.

 switch completion {
    case .failure (let error):
      switch error as? CustomError {
      case .cFailed:
         // show alert here
      case .nFailed:
        // show alert here
      default:
       // show alert here
      }

      switch error as? ClassError {
      case .gFailed:
         // show alert here
      default:
        // show alert here
      }

    return
  }
4 Answers

You can try to cast error to desire type, example:

if let customError = error as? CustomError {
    // handle CustomError switch statement here
} else if classError = error as? ClassError {
    // handle ClassError switch statement here
}

Hope this solution will help you!

You can write a properly nested switch like this:

switch completion {
case .failure(let error as CustomError):
    switch error {
    case .cFailed:
        // show alert here
        break
    case .nFailed:
        // show alert here
        break
    default:
        // show alert here
        break
    }
case .failure(let error as ClassError):
    switch error {
    case .gFailed:
        print("ClassError.gFailed")
    default:
        // show alert here
        break
    }
default:
    break
}

Or else, you can write a single level switch:

switch completion {
case .failure(CustomError.cFailed):
    //...
    break
case .failure(CustomError.nFailed):
    //...
    break
case .failure(ClassError.gFailed):
    print("ClassError.gFailed")
default:
    break
}
let error: Error = CustomError.nFailed

switch error {
case CustomError.cFailed:
    print("cFailed")
case CustomError.nFailed:
    print("nFailed") // "nFailed\n"
case ClassError.gFailed:
    print("gFailed")
default:
    print("default")
}

Works fine !

Here's another alternative, throw the error on the switch case and catch it outside, how 'bout dah?

do {
    switch result {
    case .success:
        print("WOO")
    case .failure(let error):
        throw error
    }
} catch CustomError.cFailed {
    print("cFailed")
} catch CustomError.nFailed {
    print("nFailed")
} catch ClassError.gFailed {
    print("gFailed")
} catch {
    print(error)
}
Related