在我的第一部分中,我根据行显示不同的样式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
}
}
答案 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
。