Skip to content

Instantly share code, notes, and snippets.

@cwagdev
Created July 17, 2015 19:40
Show Gist options
  • Star 15 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save cwagdev/635ce973e8e86da0403a to your computer and use it in GitHub Desktop.
Save cwagdev/635ce973e8e86da0403a to your computer and use it in GitHub Desktop.
Luhn Algorithm in Swift
func luhnCheck(number: String) -> Bool {
var sum = 0
let digitStrings = reverse(number).map { String($0) }
for tuple in enumerate(digitStrings) {
if let digit = tuple.element.toInt() {
let odd = tuple.index % 2 == 1
switch (odd, digit) {
case (true, 9):
sum += 9
case (true, 0...8):
sum += (digit * 2) % 9
default:
sum += digit
}
} else {
return false
}
}
return sum % 10 == 0
}
luhnCheck("49927398716")
luhnCheck("49927398717")
@cwagdev
Copy link
Author

cwagdev commented Jul 17, 2015

@adamwaite
Copy link

Swift 2:

private static func luhnCheck(cardNumber: String) -> Bool {
        var sum = 0
        let reversedCharacters = cardNumber.characters.reverse().map { String($0) }
        for (idx, element) in reversedCharacters.enumerate() {
            guard let digit = Int(element) else { return false }
            switch ((idx % 2 == 1), digit) {
            case (true, 9): sum += 9
            case (true, 0...8): sum += (digit * 2) % 9
            default: sum += digit
            }
        }
        return sum % 10 == 0
    }

@dyegos
Copy link

dyegos commented Jan 11, 2017

Swift 3

private static func luhnCheck(cardNumber: String) -> Bool {
        var sum = 0
        let reversedCharacters = cardNumber.characters.reversed().map { String($0) }
        for (idx, element) in reversedCharacters.enumerated() {
            guard let digit = Int(element) else { return false }
            switch ((idx % 2 == 1), digit) {
            case (true, 9): sum += 9
            case (true, 0...8): sum += (digit * 2) % 9
            default: sum += digit
            }
        }
        return sum % 10 == 0
    }

@GalaevAlexey
Copy link

GalaevAlexey commented Nov 15, 2017

Swift 4

extension String {
    func luhnCheck() -> Bool {
        var sum = 0
        let reversedCharacters = self.reversed().map { String($0) }
        for (idx, element) in reversedCharacters.enumerated() {
            guard let digit = Int(element) else { return false }
            switch ((idx % 2 == 1), digit) {
            case (true, 9): sum += 9
            case (true, 0...8): sum += (digit * 2) % 9
            default: sum += digit
            }
        }
        return sum % 10 == 0
    }
}

@LuLuSaBee
Copy link

Swift 5

private static func luhnCheck(cardNumber: String) -> Bool {
    var sum = 0
    let reversedCharacters = cardNumber.reversed().map { String($0) }
    for (idx, element) in reversedCharacters.enumerated() {
        guard let digit = Int(element) else { return false }
        switch ((idx % 2 == 1), digit) {
        case (true, 9): sum += 9
        case (true, 0...8): sum += (digit * 2) % 9
        default: sum += digit
        }
    }
    return sum % 10 == 0
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment