swift2 如何在Swift 2中检查字符串是否只包含数字?

mwg9r5ms  于 2022-11-06  发布在  Swift
关注(0)|答案(3)|浏览(467)

在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可转换,错误:NilLiteral可转换)'
现在还有更好的方法吗?谢谢!

soat7uwm

soat7uwm1#

在Swift 2中,NSRegularExpression“抛出”,因此您必须将其与try一起使用。
此外,您不能再为选项传递nil:如果您不想指定选项,则传递一个空数组(对于firstMatchInString也是一样)。
self.length()应该变成self.characters.count
最后注意:如果目标是确定String是否只包含数字,并且由于您将其命名为“isNumbersOnly”,则如果只有数字,则结果Boolean应该为true:它现在是相反的。我已经在我的例子中修正了这个问题。
忽略错误:

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)
}
lzfw57am

lzfw57am2#

除了使用正则表达式,您还可以使用CharacterSet s来检查是否存在某些字符。要检查字符串是否只有数字,您可以使用以下命令:

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,而且在我看来,它比使用regex字符串要干净得多。

9bfwbjaz

9bfwbjaz3#

Swift 2已经调整了错误处理过程;您现在应该对调用执行try,而不是指定error,并准备好捕获异常。
例如:

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

...假设您选择不处理错误状态。

相关问题