如何在switch语句中落实到特定情况

时间:2016-05-05 17:11:38

标签: swift switch-statement fall-through

在我的第一部分中,我根据行显示不同的样式UIAlertController。第二部分做了无关的事情。为了避免case中的代码重复,我如何在switch语句中遇到特定情况?这有可能迅速吗?有没有其他语言有这个概念?

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    tableView.deselectRowAtIndexPath(indexPath, animated: true)
    var alertController: UIAlertController!
    let cancelAction = UIAlertAction(title: L10n.Cancel.localized, style: .Cancel) { (action) in
        // ...
    }
    switch (indexPath.section, indexPath.row) {
    case (0, 0):
        alertController = UIAlertController(title: nil, message: nil, preferredStyle: .ActionSheet)
        //add other actions
    case (0, 1):
        alertController = UIAlertController(title: nil, message: nil, preferredStyle: .Alert)
        //add other actions
    case (0, _): //this case handles indexPath.section == 0 && indexPath.row != 0 or 1
        //I want this to be called too if indexPath.section is 0;
        //even if indexPath.row is 0 or 1.
        alertController.addAction(cancelAction)
        presentViewController(alertController, animated: true, completion: nil)
    default:
        break
    }
}

2 个答案:

答案 0 :(得分:1)

使用Swift pip freeze 语句似乎无法实现您目前要实现的目标。正如@AMomchilov的另一个回答中所提到的

  Swift中的

切换语句不会在每个案例的底部落入默认情况下的下一个。相反,整个switch语句在第一个匹配的switch case完成后立即完成执行,而不需要显式的break语句。

switch关键字似乎也无法解决问题,因为它不会评估案例条件:

  

fallthrough语句导致程序执行从switch语句中的一个case继续到下一个case。即使case标签的模式与switch语句的控制表达式的值不匹配,程序也会继续执行下一种情况。

我认为最好的解决方案是拥有像

这样的东西
fallthrough

答案 1 :(得分:-1)

您使用fallthrough关键字。

  

没有隐含的堕落

     

与C和Objective-C中的switch语句相比,切换   Swift中的语句不会落在每个案例的底部   默认情况下进入下一个。相反,整个switch语句   一旦第一个匹配的开关盒就完成它的执行   完成后,无需明确的中断声明。这使得   switch语句比C语言更安全,更容易使用   避免错误地执行多个开关盒。 - The Swift Programming Language (Swift 2.2) - Control Flow

但是,fallthrough关键字只能用于添加功能。您不能使第一种和第二种情况相互排斥,并且也是第三种情况。在您的情况下,将在switch语句之后无条件地重构常见情况,并将默认情况从break更改为return