0

私のreplacementTextHasLetter定数が、以下の条件付きで文字をテキストフィールドに貼り付けることを妨げないのはなぜですか?

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

}

編集:私はそれを理解しました。existingTextHasDecimalSeparatorreplacementTextHasDecimalSeparatorは基本的に、テキストフィールドに小数があるかどうか、ユーザーが新しい小数を入力しようとしているかどうかを判断して false を返すため、最初の例が機能することは不可能です。追加すると

&& replacementTextHasLetter != nil

条件付きでは、すべてのステートメントが同時に真になることはできないため、実際には目的を果たしていません。ありがとう@sonofabeach

4

1 に答える 1

0

これらの 2 行:

if existingTextHasDecimalSeparator != nil && replacementTextHasDecimalSeparator != nil {
    return false
}

if replacementTextHasLetter != nil {
    return false
}

実質的には次のものと同じです:

if (existingTextHasDecimalSeparator != nil && replacementTextHasDecimalSeparator != nil) || replacementTextHasLetter != nil {
    return false
}

最後の条件の||代わりに を使用していることに注意してください。&&

于 2016-12-21T00:37:27.043 に答える