У вас неправильный код для определения обновленного текста. Помните, что любой объем текста может быть удален, заменен или добавлен, и это может произойти в любом месте строки на основе текущего выделения.
Ваш код должен выглядеть следующим образом:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let newText = textField.text!.replacingCharacters(in: Range(range, in: textField.text!)!, with: string)
if newText.count == 11 {
print("account 11 digit = \(newText)")
}
return true
}
Принудительное развертывание в этом коде безопасно. Свойство text
UITextField
никогда не может вернуть nil
, и преобразование диапазона всегда будет успешным, если Apple не введет ошибку в UIKit.
Также обратите внимание, что использование characters
не рекомендуется дляпока. И Swift не нуждается в точках с запятой в конце строк и не нуждается в скобках в операторах if
.