【问题标题】:switch statement gone wrong - swift languageswitch 语句出错 - 快速语言
【发布时间】:2014-06-10 18:31:21
【问题描述】:

在 Obj-c 中我做了一个 switch 语句,我曾经使用 UIsplitviewcontroller 在我的 iPad 应用程序中移动 现在我想快速做同样的事情......我尝试了几个小时,现在我唯一无法尝试的是代码,因为它说某种编译错误 反正 这是我在 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 中得到的结果

    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:


}

错误是:预期的声明在与 让 viewController = UIViewcontroller()

【问题讨论】:

  • 您在 Swift 中创建的内容与您的 Obj-C 版本完全不同。例如,您为什么将viewController 传递到您的switch 语句中并将其与Strings 进行比较?您是否尝试在 Swift 中创建与上述示例完全相同的内容?
  • @Firo 是的,我正在尝试将上面的示例从 obj-c 重新创建为 swift。但很难理解 swift

标签: switch-statement swift


【解决方案1】:

让我们从您的 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 中使用相同的 sn-p:

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 cases 可以是多行而不使用{ }。如果在 Obj-C 示例中尝试使用它们,则会出现 Closure expression is unused 错误。
【解决方案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的re声明肯定有错误?内部 let 声明将掩盖外部 var 意味着它将保持未设置...
猜你喜欢
  • 2021-07-24
  • 2011-10-24
  • 1970-01-01
  • 2013-06-21
  • 2015-10-28
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多