realm / SwiftLint

A tool to enforce Swift style and conventions.
https://realm.github.io/SwiftLint
MIT License
18.59k stars 2.22k forks source link

Rule Request: Prefer `if` and `switch` expressions #5472

Open SimplyDanny opened 6 months ago

SimplyDanny commented 6 months ago

In version 5.9, Swift got support for if and switch expressions. A rule to enforce them where allowed should be possible.

In the first implementation, the rule does not need to be configurable. It should be opt-in and might support automatic rewriting.

Triggering:

func f(cond: Bool) -> Int {
    if cond {
        return 1
    } else {
        return 2
    }
}
func f(cond: Bool) {
    let r: Int
    if cond {
        r = 1
    } else {
        r = 2
    }
}

Non-triggering:

func f(cond: Bool) -> Int {
    if cond {
        // Nothing
    } else {
        return 2
    }
    return 1
}
AballahNsour commented 4 months ago

will work on this request

Brett-Best commented 3 months ago

I'd really like to see this, I've provided another example below which covers:

import Foundation

enum SupportedFruit {
  case lemon
  case lime
  case orange
}

enum SupportFruitError: Error {
  case didYouMean(String)
}

// NON-TRIGGERING
extension SupportedFruit {
  init(rawValue: String) throws {
    self = switch rawValue {
    case "🍋": .lemon
    case "🍋‍🟩": .lime
    case "🍊": throw SupportFruitError.didYouMean("to use an orange emoji instead of tangerine emoji")
    default: fatalError()
    }
  }
}

// TRIGGERING
extension SupportedFruit {
  init(rawValue: String) throws {
    switch rawValue {
    case "🍋": self = .lemon
    case "🍋‍🟩": self = .lime
    case "🍊": throw SupportFruitError.didYouMean("to use an orange emoji instead of tangerine emoji")
    default: fatalError()
    }
  }
}

@AballahNsour I see you have a branch on your fork for starting the implementation of this rule, let me know if I can do anything to help out. My Swift Syntax skills are pretty lacking though 😢.