[swift-evolution] [Idea] Add forced conversion for Error catching pattern matching

Brent Royal-Gordon brent at architechies.com
Mon Mar 21 22:26:07 CDT 2016


> do {
>     let action = chooseAction(game)
>     game = try game.applyAction(action)
> } catch let e as ActionError {
>     game.failedAction = e
> } catch _ {
>     fatalError(“This is an unfortunate bit of noise :/")
> }

If you're just worried about the noise...

	try! {
		do {
			let action = chooseAction(game)
			game = try game.applyAction(action)
		}
		catch let e as ActionError {
			game.failedAction = e
		}
	}()

Or if that's too much syntax:

	func mustSucceed<Return>(function: () throws -> Return) -> Return {
		return try! function()
	}
	
	mustSucceed {
		do {
			let action = chooseAction(game)
			game = try game.applyAction(action)
		}
		catch let e as ActionError {
			game.failedAction = e
		}
	}

Or, if you use this specific ActionError logic widely, you can put that in a function:

	func catchActionError<Return>(function: () throws -> Return) -> Return? {
		do {
			return try function()
		}
		catch e as ActionError {
			game.failedAction = e
			return nil
		}
		catch {
			fatalError()
		}
	}
	
	catchActionError {
		let action = chooseAction(game)
		game = try game.applyAction(action)
	}

-- 
Brent Royal-Gordon
Architechies



More information about the swift-evolution mailing list