私は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
}
}
Swift lintは "Cyclomatic Complexity Violation"警告を生成します。この警告が発生した理由と解決方法は?
警告は、関数が metric で定義されているように複雑すぎるために発生します。
この特定のケースでそれを回避する簡単な方法は、いくつかの単純な数学を使用することです。
func selectedMenuInLoggedOutState(sender: UIButton) {
guard let menu = LeftGuestMenu(rawValue: sender.tag - 1) else { return }
self.changeGuestViewController(menu)
}
メソッドは複雑すぎるです。ただし、コードを書き直す代わりに、switches
をcyclomatic_complexity
の計算から除外することもできます(完全に読みやすいため)のようにこの:
cyclomatic_complexity:
ignores_case_statements: true
繰り返される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)
}
}
ロジックを変更したくない場合は、以下に従ってください。 「cyclomatic_complexity:」プロパティを追加し、.swiftlint.ymlファイルに警告値を設定します。
cyclomatic_complexity:警告:25
注:ここで警告値を設定するとは、線形に独立したパスの数を増やすことを意味します。独自の値を設定できます。
次のようなコードでswiftlint警告を無効にできます。
// swiftlint:disable cyclomatic_complexity
func selectedMenuInLoggedOutState(sender: UIButton) {
...
}
// swiftlint:enable cyclomatic_complexity
または、次のswiftlint警告を明示的に無効にする場合:
// swiftlint:disable:next cyclomatic_complexity
func selectedMenuInLoggedOutState(sender: UIButton) {