Replacement for goto statement in Swift

Pawan Joshi picture Pawan Joshi · Feb 8, 2015 · Viewed 13.4k times · Source

How can I transfer control to a specific line in Swift code?

In Objective-C I would do something like the following, using goto

if(a==b)
{
    goto i123;
}
else
{
    goto i456;
}
NSLog(@"the not reachable point");
i123:
NSLog(@"line 123 is here");
int j = 5;
int x = 2+j;
i456:
NSLog(@"line 456 is here");

The only control transfer statements in Swift I could find were continue, break, fallthrough, and return

continue and break only work with loops; return and fallthrough don't transfer control this way.

What can I use?

EDIT:-

Julien__'s answer didn't actually solve my problem but it could be the only available option right now. so i have accepted the answer by Julien__

Answer

Julien__ picture Julien__ · Feb 8, 2015

Perhaps a switch statement ?

switch (a==b){
default:
    NSLog(@"the not reachable point");
    fallthrough­
case true:
    NSLog(@"line 123 is here");
    int j = 5;
    int x = 2+j;
    fallthrough­
case false:
    NSLog(@"line 456 is here");
}

EDIT : Here is how you could go backward.

let START = 0
let STOP  = -1
var label = START

while(label != STOP){
    switch (label){

    default:
        label = START­

    case START:
        NSLog(@"the not reachable point");
        if a==b {
            label = 123
        } else {
            label = 456
        }

    case 123:
        NSLog(@"line 123 is here");
        int j = 5;
        int x = 2+j;
        fallthrough­

    case 456:
        NSLog(@"line 456 is here");
        fallthrough

    case STOP:
        label = STOP
    }
}

Wrap your code in a giant (but well organized) switch statement. You could even create a function named goto in order to modify the value of the label var.