如何使textField验证代码更紧凑和更易读?

时间:2018-10-05 02:45:27

标签: ios swift uitextfield

我正在编写用于textField验证的代码。 textField根本不允许用户输入16 .. <80以外的年龄。我已经在下面编写了代码,感觉质量很差。您提出的使下面的代码更具可读性的建议将非常有帮助。

设置:

创建textField并使其自身成为委托。

extension UserProfileViewController: UITextFieldDelegate {
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        let numberFiltered = string.components(separatedBy: NSCharacterSet(charactersIn: "0123456789").inverted).joined(separator: "")

        guard string == numberFiltered, range.location < 2 else {
            return false
        }

        if range.location==0, string.intValue == 0 {
            return false
        }

        guard let textFieldValue = textField.text?.intValue, let currentValue = string.intValue else {
            return true
        }

        let totalValue = textFieldValue*10 + currentValue

        switch totalValue {
        case 16..<80:
            return true
        default:
            textField.text = ""
            return false
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您所做的大多数事情都是不必要的。只需计算新字符串是什么,尝试转换为Int,然后检查范围即可。

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let oldText = textField.text!
    let newText = oldText.replacingCharacters(in: Range(range, in: oldText)!, with: string)
    if let num = Int(newText), num >= 16 && num < 70 {
        return true
    }

    return false
}

仅供参考-此处!的两种用法都是安全的。 UITextField text将永远不会返回nil,除非iOS中存在严重错误,否则范围将有效。