import Foundation public struct PlateNumber { private var number: String = "" private var numberEnglish: String = "" private let maxLength = 9 private let mainPartLength = 6 private let isDigitMask = [false, true, true, true, false, false, true, true, true] public init(_ string: String) { setNumber(string) } public func asString() -> String { return self.number.filter { !$0.isWhitespace }.uppercased() } public func mainPart() -> String { return String(self.numberEnglish.prefix(mainPartLength)) } public func region() -> String { guard numberEnglish.count > mainPartLength else { return "" } return String(self.numberEnglish.dropFirst(mainPartLength)) } public var isValid: Bool { number.count >= 8 } public mutating func setNumber(_ number: String) { self.number = number self.numberEnglish = String(self.number.map { Constants.pnLettersMap[$0] ?? $0 }) } // MARK: - UIKeyInput public var hasText: Bool { return !number.isEmpty } // Returns true if number was changed @discardableResult public mutating func insertText(_ text: String) -> Bool { guard number.count < maxLength, text.count == 1 else { return false } // TODO: Do proper validation // if text.first?.isNumber == isDigitMask[number.count] { // setNumber(number + text) // return true // } else { // return false // } setNumber(number + text) return true } @discardableResult public mutating func deleteBackward() -> Bool { guard !number.isEmpty else { return false } setNumber(String(number.dropLast())) return true } }