Метод 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
}

Обратите внимание на использование || вместо && для последнего условия.

Другие вопросы по тегам