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

这两行:

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 回答