【问题标题】:How to check if a string only contains numbers in Swift 2?如何检查字符串是否仅包含 Swift 2 中的数字?
【发布时间】:2015-10-10 21:11:13
【问题描述】:

在 Swift 2 之前,我使用此扩展来检查字符串是否仅由数字组成:

func isNumbersOnly() -> Bool {
        let regexNumbersOnly = NSRegularExpression(pattern: ".*[^0-9].*", options: nil, error: nil)!
        return regexNumbersOnly.firstMatchInString(self, options: nil, range: NSMakeRange(0, self.length())) != nil
}

但现在使用 Swift 2 我得到了错误

无法使用“NSRegularExpression”类型调用初始化程序 类型的参数列表'(模式:字符串,选项: NilLiteralConvertible,错误:NilLiteralConvertible)'

现在有更好的方法吗?谢谢!

【问题讨论】:

    标签: string swift2 xcode7


    【解决方案1】:

    在 Swift 2 NSRegularExpression 中“抛出”,因此您必须将其与 try 一起使用。

    您也不能再为选项传递nil:如果您不想指定选项,请传递一个空数组(firstMatchInString 也是如此)。

    self.length() 应该变成self.characters.count

    最后一点:如果目标是确定字符串是否仅包含数字,并且由于您将其命名为“isNumbersOnly”,那么如果只有数字,则生成的布尔值应该为真:它目前是相反的。我已经在我的示例中解决了这个问题。

    忽略错误:

    let regexNumbersOnly = try! NSRegularExpression(pattern: ".*[^0-9].*", options: [])
    return regexNumbersOnly.firstMatchInString(self, options: [], range: NSMakeRange(0, self.characters.count)) == nil
    

    适当的错误处理:

    do {
        let regexNumbersOnly = try NSRegularExpression(pattern: ".*[^0-9].*", options: [])
        return regexNumbersOnly.firstMatchInString(self, options: [], range: NSMakeRange(0, self.characters.count)) == nil
    } catch let error as NSError {
        print(error.description)
    }
    

    【讨论】:

      【解决方案2】:

      Swift 2 调整了错误处理流程;您现在应该try 调用,而不是指定error,并准备好捕获异常。

      例如

      do {
          let regexNumbersOnly = try NSRegularExpression(pattern: ..., options: nil)
          ... etc ...
      } catch _ {}
      

      ...鉴于您选择不处理错误状态。

      【讨论】:

      • try! 可能更可取的一种情况。
      • 好的,我自己对语法比较陌生,我主要想传达init 更改的策略原因以及您需要尝试/捕获。我将标记为社区 wiki 以改进代码。
      • 基本上,如果您不想捕获错误(您使用的是_),则不需要do { try ...} catch {},您可以只写let regex = try! ...。我认为这在这种情况下更可取,因为您不依赖任何外部变量,并且正则表达式 init 应该始终成功。
      【解决方案3】:

      您可以使用CharacterSets 来检查某些字符是否存在(或不存在),而不是使用正则表达式。要检查字符串是否只有数字,您可以使用以下命令:

      extension String {
          var isDigits: Bool {
              if isEmpty { return false }
              // The inverted set of .decimalDigits is every character minus digits
              let nonDigits = CharacterSet.decimalDigits.inverted
              return rangeOfCharacter(from: nonDigits) == nil
          }
      }
      

      这种方法可以应用于任何类型的CharacterSet,在我看来,它比使用正则表达式字符串要干净得多。

      【讨论】:

      • 这将为空字符串返回 true
      • @Leon 感谢您指出这一点。我已经更新了示例代码。
      猜你喜欢
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多