周期性复杂性违规:函数应该具有10或更低的复杂度:当前复杂度等于13(cyclomatic_complexity)

Che*_*wra 10 ios swift3 swiftlint xcode8

我在swift3中有以下代码,我使用swift lint来代码.代码如下:

    func selectedMenuInLoggedOutState(sender: UIButton) {
    switch sender.tag {
    case 1:
      if let menu = LeftGuestMenu(rawValue: 0) {
        self.changeGuestViewController(menu)
      }
    case 2:
      if let menu = LeftGuestMenu(rawValue: 1) {
        self.changeGuestViewController(menu)
      }
    case 3:
      if let menu = LeftGuestMenu(rawValue: 2) {
        self.changeGuestViewController(menu)
      }
    case 4:
      if let menu = LeftGuestMenu(rawValue: 3) {
        self.changeGuestViewController(menu)
      }
    case 5:
      if let menu = LeftGuestMenu(rawValue: 4) {
        self.changeGuestViewController(menu)
      }
    case 6:
      if let menu = LeftGuestMenu(rawValue: 5) {
        self.changeGuestViewController(menu)
      }
    default:
      break
    }
  }
Run Code Online (Sandbox Code Playgroud)

swiftlint会产生一个称为圈复杂度的警告.为什么会出现此警告警告以及如何解决此问题?

在此输入图像描述

Jak*_*lář 26

该方法过于复杂.但是,不是重写代码,而是可以switchescyclomatic_complexity计算中排除(因为它们是完全可读的),如下所示:

cyclomatic_complexity:
  ignores_case_statements: true
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个解决方案。我不想改变我的案件陈述。 (2认同)

dea*_*rne 13

您可以在代码中禁用 swiftlint 警告,如下所示:

// swiftlint:disable cyclomatic_complexity
func selectedMenuInLoggedOutState(sender: UIButton) {
    ...
}
// swiftlint:enable cyclomatic_complexity
Run Code Online (Sandbox Code Playgroud)

或者,如果您只想明确禁用下一个 swiftlint 警告:

// swiftlint:disable:next cyclomatic_complexity
func selectedMenuInLoggedOutState(sender: UIButton) {
Run Code Online (Sandbox Code Playgroud)


Dan*_* T. 11

出现警告是因为您的功能过于复杂,因为度量标准定义了从根本上计算需要做出的决策数量.

在这种特殊情况下避免它的一种简单方法是使用一些简单的数学:

func selectedMenuInLoggedOutState(sender: UIButton) {
    guard let menu = LeftGuestMenu(rawValue: sender.tag - 1) else { return }
    self.changeGuestViewController(menu)
}
Run Code Online (Sandbox Code Playgroud)

  • 就我个人而言,我将忽略该棉绒消息;开关更容易阅读 (3认同)
  • 经过反思,我不认为"数学"解决方案在这种情况下是如此糟糕.您可以使用它或尝试我的简化开关; 哪个你喜欢 (2认同)