【问题标题】:Swift Form Validation - Check if Int or String has been enteredSwift 表单验证 - 检查是否输入了 Int 或 String
【发布时间】:2015-02-02 22:08:40
【问题描述】:

我正在尝试验证表单以确保用户输入的是整数而不是字符串。我可以检查数字是否为整数,如下所示:

 var possibleNumber = timeRetrieved.text
    convertedNumber = possibleNumber.toInt()
    // convertedNumber is inferred to be of type "Int?", or "optional Int"

    if convertedNumber != nil {

        println("It's a number!")

        totalTime = convertedNumber!


    }

我的问题是我想确保用户没有输入任何文本、双打等。我只想要整数。以下代码不起作用,因为如果变量是整数,它的计算结果为 true。如果变量不是整数,我应该使用什么代码来评估?

if convertedNumber != nil  {


        let alertController = UIAlertController(title: "Validation Error", message: "You must enter an integer number!", preferredStyle: .Alert)
        let alertAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Destructive, handler: {(alert : UIAlertAction!) in
            alertController.dismissViewControllerAnimated(true, completion: nil)
        })
        alertController.addAction(alertAction)
        presentViewController(alertController, animated: true, completion: nil)

【问题讨论】:

    标签: string validation swift integer


    【解决方案1】:

    Int 初始化器

    这适用于 Swift 2.2 及更高版本。它基于 Minhal Khan 的回答,说明 Int 有一个带有此签名的初始化程序:init?(_ text: String, radix: Int = default)。因为radix 有一个默认值,所以可以省略。 *more info on this initializer is found here.

    var totalTime: Int?
    let possibleInt = timeRetrieved.text ?? ""
    if let convertedNumber = Int(possibleInt) {
        print("'\(possibleInt)' is an Int")
        totalTime = convertedNumber
    }
    else {
        print("'\(possibleInt)' is not an Int")
    }
    
    print("totalTime: '\(totalTime)'")
    

    注意:我假设 timeRetrievedUITextFieldUITextField text 属性是一个可选字符串(尽管在编程上不允许为 nil)。因此,编译器要求将其解包。我使用 nil 合并运算符 (??) 将 nil 替换为不会产生所需整数的空字符串。 Here's a post that discusses the optionality of UITextfield.text.

    【讨论】:

      【解决方案2】:

      基于@Graham Perks 回答 Swift 3 版本作为字符串扩展:

      extension String
      {
          var isNumeric: Bool
          {
              let range = self.rangeOfCharacter(from: CharacterSet.decimalDigits.inverted)
              return (range == nil)
          }
      }
      

      用法:

      "123".isNumeric // true
      "abc".isNumeric // false
      

      【讨论】:

        【解决方案3】:

        我所做的是获取值并检查它是否可以转换它,对我有用

        var enteredText = Int(textfield.text) 
        if enteredText == nil{
            //String entered 
        } 
        else{
        //Int entered
        }
        

        【讨论】:

          【解决方案4】:

          Swift 2 改变了这一点:因为 Int("abc") 和 Int("0") 都返回 0,所以不能使用整数转换。你可以使用这个:

          class Validation {
              static func isStringNumerical(string : String) -> Bool {
                  // Only allow numbers. Look for anything not a number.
                  let range = string.rangeOfCharacterFromSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet)
                  return (range == nil)
              }
          }
          

          它使用十进制数字字符集,并且可以更改为使用您想要的任何字符集。

          func testIsStringNumerical() {
              XCTAssertEqual(SignUpLoyaltyViewController.isStringNumerical("123"), true)
              XCTAssertEqual(SignUpLoyaltyViewController.isStringNumerical(""), true)
              XCTAssertEqual(SignUpLoyaltyViewController.isStringNumerical("12AA"), false)
              XCTAssertEqual(SignUpLoyaltyViewController.isStringNumerical("123.4"), false)
          }
          

          这比正则表达式答案要快得多。 (2000 次运行,0.004 秒 vs 正则表达式 0.233 秒)

          【讨论】:

          • 我不确定这种情况何时改变,但在 Swift 2.2 中,Int("abc")Int("0") 返回 nil。我从 Minhal Khan 的回答中收集到了这一点。我发布了一个也使用此初始化程序的答案。
          【解决方案5】:

          我真的建议使用正则表达式,我最近尝试使用 if let _ = Int(stringToTest)... 验证 10 位电话号码,但在 32 位硬件上,我遇到了范围问题。

          func validate(value: String) -> Bool {
            let PHONE_REGEX = "\\d{10}"
            let phoneTest = NSPredicate(format: "SELF MATCHES %@", PHONE_REGEX)
            let result =  phoneTest.evaluateWithObject(value)
            if result == true {
              log.info("'\(self.text!)' is a valid number.")
            } else {
              log.info("'\(self.text!)' is an invalid number.")
            }
            return result
          }
          

          【讨论】:

            【解决方案6】:

            如果用户输入的数字不是整数,convertedNumber 将为 nil。只需添加一个 else 子句,您可以在其中显示警报。

            【讨论】:

            • 谢谢,在我将 convertToInt() 函数放入我的验证函数之前,我无法让我的代码工作。
            猜你喜欢
            • 1970-01-01
            • 2012-08-17
            • 1970-01-01
            • 2015-06-09
            • 1970-01-01
            • 1970-01-01
            • 2014-06-08
            • 1970-01-01
            • 2013-10-11
            相关资源
            最近更新 更多