KennyVB
KennyVB

Reputation: 755

switch statement gone wrong - swift language

in Obj-c i made a switch statement which i used to move around in my app for iPad using UIsplitviewcontroller now i want to do the same in swift... i tried for a couple of hours and now the only thing i haven't been able to try is the code because it says some sort of compile error anyway here's what i got in Obj-c

-(void)initialSite:(int)viewId {
UIViewController *viewController;
switch (viewId) {
    case 0:{
        viewController = self.initital;
        NSString *star = [NSString stringWithFormat:@"Velkommen til %@'s  Bog",[data valueForKey:@"navn"]];
        self.navigationItem.title = star;}
        break;
    case 1:{
        viewController = self.startSide;
        NSString *start = [NSString stringWithFormat:@"%@'s  Bog, start-side",[data valueForKey:@"navn"]];
        self.navigationItem.title = start;}
        break;
}
[self showChildViewController:viewController];

}

and here's what i come up with so far in swift. still new to this and to understand it is a little hard even tho i have the swift programming language book

here's what i got so far in swift

    let viewController = UIViewController()
switch viewController {
case "initial":
let initial : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let vc0 : UIViewController = initial.instantiateViewControllerWithIdentifier("initial") as UIViewController
self.presentViewController(vc0, animated: true, completion: nil)
let rowData: NSDictionary = self.menuItemArray[indexPath.row] as NSDictionary!
self.navigation.title = rowData["navn"] as? String

case "startSide":
let startSide : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let vc1 : UIViewController = startSide.instantiateViewControllerWithIdentifier("startSide") as UIViewController
let rowData: NSDictionary = self.manuItemArray[indexPath.row] as NSDictionary!
self.presentViewController(vc1, animated: true, completion: nil)
self.navigation.title = rowData["navn"] as? String
default:


}

the error is : Expected declaration at the line with let viewController = UIViewcontroller()

Upvotes: 4

Views: 7484

Answers (2)

Firo
Firo

Reputation: 15566

Looks like SiLo beat me to it. Anyway I have my solution so I will post it. This is how I would do it:

func initialSite(viewId: Int) -> () {
    var viewController: UIViewController?
    let dataValue = data["navn"];
    var start: String?

    switch viewId {
        case 1:
            viewController = self.initital
            start = "Velkommen til \(dataValue)'s  Bog"
        case 2:
            viewController = self.startSide
            start = "\(dataValue)'s  Bog, start-side"
        default:
            break;
    }

    self.navigationItem.title = start!
    showChildViewController(viewController!)
}

Upvotes: 2

Erik
Erik

Reputation: 12858

Let's start with your Obj-C implementation:

-(void)initialSite:(int)viewId 
{
    UIViewController *viewController;
    switch (viewId) 
    {
        case 0:
        {
            viewController = self.initital;
            NSString *star = [NSString stringWithFormat:@"Velkommen til %@'s  Bog",[data valueForKey:@"navn"]];
            self.navigationItem.title = star;
        }
        break;
        case 1:
        {
            viewController = self.startSide;
            NSString *start = [NSString stringWithFormat:@"%@'s  Bog, start-side",[data valueForKey:@"navn"]];
            self.navigationItem.title = start;
        }
        break;
    }

    [self showChildViewController:viewController];
}

Now this same snippet in Swift:

func initialSite(viewID:Int)
{
    var viewController : UIViewController?

    switch (viewID)
    {
        case 0:
            viewController = self.initial
            let navn = self.data["navn"] as? String
            let star = "Velkommen til \(navn)'s Bog"
            self.navigationItem.title = star

        case 1:
            viewController = self.startSide
            let navn = self.data["navn"] as? String
            let star = "\(navn)'s Bog, start-side"
            self.navigationItem.title = star

        default:
            viewController = nil
            // do nothing
    }

    self.showChildViewController(viewController)
}

The main thing you have to remember is the difference with var vs let. Typically you will use let to create things unless those things will have their value changed later, which you use var.

The other thing is the use of optionals, with the ? suffix. This is when the value may be nil (unset), otherwise it must contain a value.

Upvotes: 6

Related Questions