J'ai le code suivant dans Swift3 et j'utilise de la charpie Swift pour lintiner le code. Le code est donné comme suit:
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
}
}
Le swiftlint génère un avertissement appelé complexité cyclomatique. Pourquoi cet avertissement survient et comment le résoudre?
L'avertissement se produit parce que votre fonction est trop complexe, comme défini par la métrique qui compte essentiellement le nombre de décisions à prendre.
Un moyen simple de l'éviter dans ce cas particulier serait avec quelques calculs simples:
func selectedMenuInLoggedOutState(sender: UIButton) {
guard let menu = LeftGuestMenu(rawValue: sender.tag - 1) else { return }
self.changeGuestViewController(menu)
}
La méthode est trop complexe . Mais au lieu de réécrire le code, vous pouvez exclure switches
du calcul cyclomatic_complexity
(car ils sont parfaitement lisibles) comme ceci:
cyclomatic_complexity:
ignores_case_statements: true
Si vous ne souhaitez pas modifier votre logique, procédez comme suit: Ajoutez la propriété "cyclomatic_complexity:" et définissez la valeur d'avertissement dans le fichier .swiftlint.yml.
cyclomatic_complexity: warning: 25
Remarque: Ici, le réglage de la valeur d’avertissement signifie l’augmentation du nombre de chemins linéairement indépendants. Vous pouvez définir votre propre valeur.
Vous pouvez réduire votre complexité en éliminant les instructions if let
répétées:
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)
}
}