UITextFieldDelegate 的 shouldChangeCharactersIn 方法 - 为什么不能组合条件语句来检查小数点分隔符和字母的数量
UITextFieldDelegate's shouldChangeCharactersIn method - why cannot combine conditional statements checking both # of decimal separators and letters
为什么我的 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 基本上确定文本字段中是否有小数以及用户是否试图输入一个新的,return false。当我添加
&& replacementTextHasLetter != nil
就条件而言,它并没有真正起到作用,因为所有陈述不可能同时为真。谢谢@sonofabeach
这两行:
if existingTextHasDecimalSeparator != nil && replacementTextHasDecimalSeparator != nil {
return false
}
if replacementTextHasLetter != nil {
return false
}
实际上与以下内容相同:
if (existingTextHasDecimalSeparator != nil && replacementTextHasDecimalSeparator != nil) || replacementTextHasLetter != nil {
return false
}
请注意在最后一个条件中使用 ||
而不是 &&
。
为什么我的 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 基本上确定文本字段中是否有小数以及用户是否试图输入一个新的,return false。当我添加
&& replacementTextHasLetter != nil
就条件而言,它并没有真正起到作用,因为所有陈述不可能同时为真。谢谢@sonofabeach
这两行:
if existingTextHasDecimalSeparator != nil && replacementTextHasDecimalSeparator != nil {
return false
}
if replacementTextHasLetter != nil {
return false
}
实际上与以下内容相同:
if (existingTextHasDecimalSeparator != nil && replacementTextHasDecimalSeparator != nil) || replacementTextHasLetter != nil {
return false
}
请注意在最后一个条件中使用 ||
而不是 &&
。