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
}