【问题标题】:Avoid crash from double period during restrained CharacterSet避免在受约束的 CharacterSet 期间从双周期崩溃
【发布时间】:2024-01-08 05:23:01
【问题描述】:

我有一个即将完善的 GPA 计算器项目。尽管“.0123456789”是唯一允许的字符,但我需要防止用户输入非浮点数。例如,如果用户输入 2.3。无论出于何种原因,我的程序崩溃了,因为这个“输入”不是浮点数。我在下面包含了我的代码的基础。

func textField(_ textField: UITextField, shouldChangeCharactersIn     range: NSRange, replacementString string: String) -> Bool {

    var allowed = CharacterSet.decimalDigits
    let period = CharacterSet.init(charactersIn: ".")
    allowed.formUnion(period)

    //UNCOMMENT when isSuperset is working
    //let characterSet = CharacterSet(charactersIn: string)
    //return allowed.isSuperset(of: characterSet)

    // Swift 3 appropriate solution
    let isSuperset = string.rangeOfCharacter(from: allowed.inverted) == nil
    return isSuperset
}


@IBAction func Calculate(_ sender: AnyObject) {

    // if not filled in
    if Credits1TF.text == "" || Grade1TF.text == "" || CumCredits.text == "" || CumGPA.text == "" || Credits1TF.text == "." || Grade1TF.text == "." || CumCredits.text == "." || CumGPA.text == "."
    {
 print...         
}            else 
        {
            //credits
            let credit1 = Float(Credits1TF.text!)!
            //grades
            let grade1 = Float(Grade1TF.text!)!
            //math
            let firstgrade = credit1 * grade1

我将如何着手在文本字段中添加仅接受一位小数点,因为它与文本字段功能相关?还是有更简单/直接的方法?

更新 1:

   let credit1 = Float(Credits1TF.text!)!
            if credit1 != nil
            {
                let newcredits1 = credit1

            //grades
            let grade1 = Float(Grade1TF.text!)!
                if grade1 != nil
                { let newgrade1 = grade1

除非我的处理不正确,否则我会收到“将 'Float' 类型的非可选值与 nil 进行比较总是返回 true”的警告。我的印象是,如果 credits1 或grade1 != nil,我的数值很好,以后不会导致崩溃。

【问题讨论】:

  • 如果您想避免崩溃,请停止使用!
  • 用a会更好吗?
  • 不,最好使用可选绑定而不是强制解包。
  • 我会调查的,谢谢救星!
  • 阅读 The Swift Programming Language 一书中关于可选和可选绑定的所有信息。

标签: swift floating-point decimal nscharacterset


【解决方案1】:
func textField(_ textField: UITextField, shouldChangeCharactersIn     range: NSRange, replacementString string: String) -> Bool {

    var allowed = CharacterSet.decimalDigits
    let period = CharacterSet.init(charactersIn: ".")
    allowed.formUnion(period)


    if (textField.text?.contains("."))! && string.contains(".")
    {
        return false
    }
    else
    {
        let isSuperset = string.rangeOfCharacter(from: allowed.inverted) == nil

        return isSuperset

    }

}

此代码将接受的字符限制为“0-9”,并且还允许输入一个句点/小数点。在 if 语句的 else 部分中可以看到 0-9 字符的返回。这个答案的灵感来自 Raj 在上一个问题How can I limit the number of decimal points in a UITextField? 中的回答。

【讨论】:

    最近更新 更多