advantis
7/6/2014 - 10:42 AM

Hybrid Luhn algorithm

Hybrid Luhn algorithm

func isLuhnValid(number: String) -> Bool {
    let asciiOffset: UInt8 = 48
    let digits = Array(number.utf8).reverse().map{$0 - asciiOffset}

    let convert: (UInt8) -> (UInt8) = {
        let n = $0 * 2
        return n > 9 ? n - 9 : n
    }

    var sum: UInt8 = 0
    for (index, digit) in enumerate(digits) {
        if index & 1 == 1 {
            sum += convert(digit)
        } else {
            sum += digit
        }
    }
    return sum % 10 == 0
}