import Foundation public class 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 setNumber(_ number: String) { self.number = number self.numberEnglish = String(self.number.map { Constants.pnLettersMap[$0] ?? $0 }) } public func asString() -> String { return self.number } 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 } // MARK: - UIKeyInput public var hasText: Bool { return !number.isEmpty } // Returns true if number was changed public func insertText(_ text: String) -> Bool { guard number.count < maxLength, text.count == 1 else { return false } if text.first?.isNumber == isDigitMask[number.count] { setNumber(number + text) return true } else { return false } } public func deleteBackward() -> Bool { guard !number.isEmpty else { return false } setNumber(String(number.dropLast())) return true } }