Skip to content

Instantly share code, notes, and snippets.

@insidegui
Forked from igorcferreira/CardType.swift
Created January 11, 2017 20:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save insidegui/58778c6aed8c9722dfd1ab8c22f5fcbc to your computer and use it in GitHub Desktop.
Save insidegui/58778c6aed8c9722dfd1ab8c22f5fcbc to your computer and use it in GitHub Desktop.
Basic implementation to apply different regexes over a card number String and find the card type
import UIKit
//: Basic implementation to apply different regexes over a card number String and find the card type
enum CardType:String, CustomStringConvertible {
case invalid = "Not valid"
case visa = "^4[0-9]{6,}$"
case mastercard = "^5[0-9]{6,}$"
case amex = "^3[47][0-9]{13}$"
case diners = "^3(?:0[0-5]|[68][0-9])[0-9]{11}$"
case elo = "^[456](?:011|38935|51416|576|04175|067|06699|36368|36297)\\d{10}(?:\\d{2})?$"
case jcb = "^(?:2131|1800|35\\d{3})\\d{11}$"
var description: String {
switch self {
case .invalid:
return "Invalid"
case .visa:
return "Visa"
case .mastercard:
return "Mastercard"
case .amex:
return "American Express"
case .diners:
return "Diners"
case .elo:
return "Elo"
case .jcb:
return "JCB"
}
}
func validate(_ cardNumber:String) -> Bool {
let predicate = NSPredicate(format: "SELF MATCHES [c] %@", self.rawValue)
let result = predicate.evaluate(with: cardNumber)
return result
}
}
let cardNumber = "4172368939385121"
let supportedTypes = [CardType.visa, .mastercard, .amex, .diners, .elo, .jcb]
var cardType = supportedTypes.lazy.first(where: { $0.validate(cardNumber) }) ?? .invalid
print("Print card type: \(cardType)") //Prints Visa
//: Or Even
extension Sequence where Iterator.Element == CardType {
func type(of input:String) -> Iterator.Element {
let cardType = self.lazy.first(where: { $0.validate(input) }) ?? .invalid
return cardType
}
}
extension CardType {
static func from(number:String) -> CardType {
let type = [CardType.visa, .mastercard, .amex, .diners, .elo, .jcb].type(of: number)
return type
}
}
cardType = CardType.from(number: cardNumber)
print("Print card type: \(cardType)") //Prints Visa
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment