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

时间:2015-10-10 21:11:14

标签: string swift2 xcode7

在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)'

现在有更好的方法吗?日Thnx!

3 个答案:

答案 0 :(得分:2)

在Swift 2 NSRegularExpression" throws"因此您必须将其与try一起使用。

此外,您无法再通过nil选项:如果您不想指定选项,请传递一个空数组(firstMatchInString也相同)。

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

最后注意:如果目标是确定一个字符串是否仅包含数字,并且由于您将其命名为#nn; isNumbersOnly",如果只有#s;那么结果布尔值应该为真数字:它目前是反向的。我已经在我的例子中解决了这个问题。

忽略错误:

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

答案 1 :(得分:1)

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

E.g。

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

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

答案 2 :(得分:1)

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

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,在我看来,比使用正则表达式字符串更清晰。