didSelectRowAtIndexpath嵌套if语句

时间:2016-04-26 16:12:19

标签: ios swift

根据indexPath.row更改didSelectRowAtIndexPath操作的最佳方法是什么。

例如,5行让我有这样的事情:

switch indexPath.row {
 case 0:
  if offlineMode {
    // do this
  } else {
    // do something else
  }
 case 1:
  if offlineMode {
    // do this
  } else {
    // do something else
  }
 case 2:
  if offlineMode {
    // do this
  } else {
    // do something else
  }
 case 3:
  if offlineMode {
    // do this
  } else {
    // do something else
  }
 case 4:
  if offlineMode {
    // do this
  } else {
    // do something else
  }
 default:
  // default behaviour
}

所以,我可以将这段代码分成doActionOnSelect(indexPath:NSIndexPath),这样它就不在didSelectRowAtIndexPath方法中。

但是,我可以在这里看到很多重复的代码。这就是我想要最小化的。

这个问题更多地围绕着MVC,责任以及从根本上构建我的代码的方式。

2 个答案:

答案 0 :(得分:1)

这都是高水平和普遍的,但希望有帮助。

重构该代码的一种方法是将您的数据/状态(可能由该大型switch语句表示的内容)放入其他对象中,例如" model"并使用section / row输入询问该模型并返回预期的输出:也许是某种类型的单元格。或者可能是另一个专门用于您需要创建的单元格的模型对象。

另一个重构是使用enum来定义您的"模式"并在switch语句中以及用于支持表视图节和行的数据中使用它。由于enum在Swift中是详尽无遗的,因此您可以消除令人困惑的default:案例。

另一种方法可以是通过模型对象表示每个单元的状态。将数据提供给模型对象,然后在创建时将模型对象传递给单元格。

无论如何,有很多方法可以给这只猫上皮:

https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=Refactor+table+view

答案 1 :(得分:1)

摆脱if / else语句的一种简单方法是创建一个实现switch案例的函数offlineDidSelectRowAtIndexPath。

以下是:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
  guard offlineMode != true else {
     offlineDidSelectRowAtIndexPath(tableview, didSelectRowAtIndexPath: indexPath)
     return 
  }

  switch indexPath.row {
   case 0:
    // do something else 1
   case 1:
    // do something else 2
   case 2:
    // do something else 3
   case 3:
    // do something else 4
   case 4:
    // do something else 5
   default:
    // default online and/or offline behaviour
}

你将有一个功能

func offlineDidSelectRowAtIndexPath(tableView: UITableView, indexPath: NSIndexPath) {

    switch indexPath.row {
     case 0:
        // do this 1
     case 1:
        // do this 2
     case 2:
        // do this 3
     case 3:
        // do this 4
     case 4:
        // do this 5
     default:
      // default behaviour
    }
}

注意:可能比我的答案更简单/更容易/更好的方式。 (另外,不要忘记休息陈述)。