私の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
}
編集:私はそれを理解しました。existingTextHasDecimalSeparatorとreplacementTextHasDecimalSeparatorは基本的に、テキストフィールドに小数があるかどうか、ユーザーが新しい小数を入力しようとしているかどうかを判断して false を返すため、最初の例が機能することは不可能です。追加すると
&& replacementTextHasLetter != nil
条件付きでは、すべてのステートメントが同時に真になることはできないため、実際には目的を果たしていません。ありがとう@sonofabeach