73 lines
1.7 KiB
Swift
73 lines
1.7 KiB
Swift
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 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
|
|
}
|
|
|
|
public 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
|
|
public 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
|
|
}
|
|
|
|
public func deleteBackward() -> Bool {
|
|
guard !number.isEmpty else {
|
|
return false
|
|
}
|
|
|
|
setNumber(String(number.dropLast()))
|
|
return true
|
|
}
|
|
}
|