switch语句出错 - Swift语言

4

在 Obj-c 中,我编写了一个 switch 语句并使用它来在 iPad 上使用 UIsplitviewcontroller 在应用程序中移动 现在我想在 swift 中做同样的事情...我试了几个小时,现在唯一我还没有尝试过的是代码,因为它显示了某种编译错误 不管怎样,这是我在 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];

}

这是我在Swift中目前的成果。虽然我有Swift编程语言书籍,但仍然很难理解。

以下是我在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:


}

错误信息是:在包含let viewController = UIViewcontroller()代码行的位置,期望有声明。

你在Swift中创建的东西看起来与你的Obj-C版本完全不同。例如,为什么要将viewController传递到switch语句中并将其与Strings进行比较?你是想在Swift中创建与上面示例完全相同的东西吗? - Firo
@Firo 是的,我正在尝试将上面的 Objective-C 示例重建为 Swift。但是我很难理解 Swift。 - KennyVB
2个回答

6

让我们从您的 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];
}

现在用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)
}

你需要记住的主要事情是使用 varlet 的区别。通常,你会使用 let 来创建东西,除非这些东西以后可能会更改值,那么你就使用 var

另外一件事是使用可选项,用 ? 后缀表示。当值可能为 nil(未设置)时,必须使用可选项,否则它必须包含一个值。


此外,Swift中的case可以是多行而不需要使用{ }。如果像Objective-C示例中那样尝试使用它们,则会出现“未使用闭包表达式”错误。 - TT--

2

看起来 SiLo 先我一步了。无论如何,我有我的解决方案,所以我会发布它。这是我会做的方式:

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!)
}

start 的重新声明肯定有误吧?内部的 let 声明会掩盖外部的 var,这意味着它将保持未设置状态... - Grimxn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接