我在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
}
}
swiftlint会产生一个称为圈复杂度的警告。为什么会出现此警告警告以及如何解决此问题?
答案 0 :(得分:17)
该方法太复杂。但是,您不必重写代码,而可以将switches
从cyclomatic_complexity
计算中排除掉(因为它们完全可读),如下所示:
cyclomatic_complexity:
ignores_case_statements: true
答案 1 :(得分:8)
警告的发生是因为metric所定义的函数过于复杂,从根本上决定了需要做出的决策数量。
在这种特殊情况下避免它的一种简单方法是使用一些简单的数学运算:
func selectedMenuInLoggedOutState(sender: UIButton) {
guard let menu = LeftGuestMenu(rawValue: sender.tag - 1) else { return }
self.changeGuestViewController(menu)
}
答案 2 :(得分:2)
您可以通过消除重复的if let
语句来降低复杂性:
func selectedMenuInLoggedOutState(sender: UIButton) {
let menu: MenuType?
switch sender.tag {
case 1:
menu = LeftGuestMenu(rawValue: 0)
case 2:
menu = LeftGuestMenu(rawValue: 1)
case 3:
menu = LeftGuestMenu(rawValue: 2)
case 4:
menu = LeftGuestMenu(rawValue: 3)
case 5:
menu = LeftGuestMenu(rawValue: 4)
case 6:
menu = LeftGuestMenu(rawValue: 5)
default:
menu=nil
}
if let menu = menu {
self.changeGuestViewController(menu)
}
}
答案 3 :(得分:2)
如果您不想更改逻辑,请按照以下说明操作。 添加“cyclomatic_complexity:”属性并在.swiftlint.yml文件中设置警告值。
cyclomatic_complexity: 警告:25
注意:此处设置警告值表示增加线性独立路径的数量。您可以设置自己的值。
答案 4 :(得分:0)
您可以在以下代码中禁用swiftlint警告:
// swiftlint:disable cyclomatic_complexity
func selectedMenuInLoggedOutState(sender: UIButton) {
...
}
// swiftlint:enable cyclomatic_complexity
或者,如果您想显式禁用下一个swiftlint警告:
// swiftlint:disable:next cyclomatic_complexity
func selectedMenuInLoggedOutState(sender: UIButton) {