Метод UITextFieldDelegate mustChangeCharactersIn - почему нельзя комбинировать условные операторы, проверяющие как количество десятичных разделителей, так и буквы
Почему моя константа replaceTextHasLetter не мешает мне вставить письмо в мое текстовое поле с условным условием ниже?
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let existingTextHasDecimalSeparator = textField.text?.range(of: ".")
let replacementTextHasDecimalSeparator = string.range(of: ".")
let charactersNotAllowed = NSCharacterSet.letters
let replacementTextHasLetter = string.rangeOfCharacter(from: charactersNotAllowed)
if existingTextHasDecimalSeparator != nil && replacementTextHasDecimalSeparator != nil && replacementTextHasLetter != nil {
return false
}
return true
}
Но когда у него есть свое отдельное условное выражение, оно работает?
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let existingTextHasDecimalSeparator = textField.text?.range(of: ".")
let replacementTextHasDecimalSeparator = string.range(of: ".")
let charactersNotAllowed = NSCharacterSet.letters
let replacementTextHasLetter = string.rangeOfCharacter(from: charactersNotAllowed)
if existingTextHasDecimalSeparator != nil && replacementTextHasDecimalSeparator != nil {
return false
}
if replacementTextHasLetter != nil {
return false
}
return true
}
РЕДАКТИРОВАТЬ: Я понял это. Невозможно сработать в первом примере, так как существующий текст HasDecimalSeparator и replaceTextHasDecimalSeparator в основном определяют, есть ли десятичное число в текстовом поле и пытается ли пользователь ввести новый, чтобы вернуть false. Когда я добавлю
&& replacementTextHasLetter != nil
условно, это просто на самом деле не служит цели, так как все утверждения не могут быть истинными одновременно. Спасибо @sonofabeach
1 ответ
Решение
Эти две строки:
if existingTextHasDecimalSeparator != nil && replacementTextHasDecimalSeparator != nil {
return false
}
if replacementTextHasLetter != nil {
return false
}
Являются ли они такими же, как:
if (existingTextHasDecimalSeparator != nil && replacementTextHasDecimalSeparator != nil) || replacementTextHasLetter != nil {
return false
}
Обратите внимание на использование ||
вместо &&
для последнего условия.