Как сделать проверку имени в iOS swift4? - PullRequest
1 голос
/ 15 марта 2019

У меня есть проверка имени, которая должна быть выполнена в swift4, в UITextField. Дело в том, что:

  1. Имя должно начинаться с буквы и заканчиваться буквой
  2. Нет пробелов и пробелов.
  3. Может содержать пробелы между ними, может содержать точку.
  4. должен содержать от 7 до 18 символов.

В настоящее время у меня есть следующая проверка в UITextField

public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let STRING_ACCEPTABLE_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
    switch textField {
    case firstName:
        print("firstname")
        if string == " " {
            return false
        } else {
            let cs = NSCharacterSet(charactersIn: STRING_ACCEPTABLE_CHARACTERS).inverted
            let filtered = string.components(separatedBy: cs).joined(separator: "")
            return (string == filtered)
        }
    }
    return true
}

Любая идея, как реализовать следующие условия. Сейчас я отключаю пробел и принимаю только алфавиты.

Любая помощь будет очень ценится

Ответы [ 3 ]

1 голос
/ 15 марта 2019

Вы можете проверить два условия, когда вы берете значение из UITextField, а именно:

  1. Имя должно начинаться и заканчиваться буквой
  2. Обрезка пробелов в конце.

А остальные условия можно выполнить внутри shouldChangeCharactersInRange, как показано ниже:

let STRING_ACCEPTABLE_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz. "
    switch textField {
    case firstName:
        print("firstname")
        //Condition for always accepting backcspaces
        if string == "" {
            return true
        }
        //Condition for restricting space at the begining
        else if textField.text?.count == 0 && string == " " {
            return false
        }
        //Condition for restricing user from entering more than 18 letters
        else if (textField.text?.count)! > 17 {
          return false
        }
        //Condition for only accepting the alphabets.
        else {
            let cs = NSCharacterSet(charactersIn: STRING_ACCEPTABLE_CHARACTERS).inverted
            let filtered = string.components(separatedBy: cs).joined(separator: "")
            return (string == filtered)
        }

Для проверки минимального количества букв, обрезки пробелов в конце и начала и окончания буквы с условиями, указанными ниже, при нажатии кнопки или чем-то эквивалентным ей:

//Trimming whitespaces at the end
let firstname = firstName.text?.trimmingCharacters(in: .whitespaces)

let letters = NSCharacterSet.letters

let prefix = String((firstname?.first)!)
let suffix = String((firstname?.last)!)

//Checking if First Character is letter
if let _ = prefix.rangeOfCharacter(from: letters) {
    print("letters found")
} else {
    print("letters not found")
}

//Checking if Last Character is letter
if let _ = suffix.rangeOfCharacter(from: letters) {
    print("letters found")
} else {
    print("letters not found")
}

Надеюсь, это поможет.

1 голос
/ 15 марта 2019

Вы можете использовать эту функцию для краткого и чистого способа

func isValid(testStr:String) -> Bool {
    guard testStr.count > 7, testStr.count < 18 else { return false }

    let predicateTest = NSPredicate(format: "SELF MATCHES %@", "^(([^ ]?)(^[a-zA-Z].*[a-zA-Z]$)([^ ]?))$")
    return predicateTest.evaluate(with: testStr)
}

Контрольные примеры

isValid(testStr: " MyNameIsDahiya") // Invalid, leading space
isValid(testStr: "MyNameIsDahiya ") // Invalid, trailing space
isValid(testStr: " MyNameIsDahiya ") // Invalid, leading & trailing space
isValid(testStr: "1MyNameIsDahiya") // Invalid, Leading num
isValid(testStr: "MyNameIsDahiya1") // Invalid, trailing num
isValid(testStr: "1MyNameIsDahiya1") // Invalid, leading & trailing num
isValid(testStr: "MyName") // Invalid, length below 7
isValid(testStr: "MyNameIsDahiyaBlahhblahh") // Invalid, length above 18

isValid(testStr: "MyNameIsDahiya") // Valid,
isValid(testStr: "Mr. Dahiya") // Valid,

Тест игровой площадки

enter image description here

Редактировать

Попробуйте это регулярное выражение:

(?mi)^[a-z](?!(?:.*\.){2})(?!(?:.* ){2})(?!.*\.[a-z])[a-z. ]{5,16}[a-z]$

Он также подтвердит все условия и длину.

1 голос
/ 15 марта 2019

Вы можете использовать регулярные выражения для проверки имени в соответствии с вашими условиями.

Я не эксперт по регулярным выражениям, но здесь вы можете увидеть пример

^[a-zA-Z](?:[a-zA-Z\.\s][^\n]*)[a-zA-Z]$

Это регулярное выражение вернет вам полные совпадения. Вы можете проверить, верна ли какая-либо найденная строка совпадений.

Ссылка с примером использования регулярных выражений в Swift.

Количество строковых символов, которые вы можете проверить с помощью Swift, например:

if string.count > 7 && string.count < 18 {
    //String valid
}
...