2015-10-10 109 views
1

斯威夫特2之前,我用这个扩展检查字符串是否仅是做出来的数字:如何检查一个字符串是否只包含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 
} 

但现在斯威夫特2我得到的错误

Cannot invoke initializer for type 'NSRegularExpression' with an argument list of type '(pattern: String, options: NilLiteralConvertible, error: NilLiteralConvertible)'

有没有更好的已知的方式现在?日Thnx!

回答

2

在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) 
} 
+0

酷,tnx!如此多的变化...... – headkit

+0

不客气。确实。 – Moritz

1

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

E.g.

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

...因为你选择不处理错误状态。

+0

其中'try!'可能更可取的一种情况。 – Sulthan

+0

好吧,我自己对语法比较陌生,我主要想传达'init'变化的政策原因以及您需要尝试/捕获的原因。我将标记为社区wiki以改进代码。 – Tommy

+1

基本上,如果你不想捕捉错误(你正在使用'_'),你不需要'do {try ...} catch {}',你可以写'let regex = try! ...'。我认为这在这种情况下更好,因为你不依赖任何外部变量,并且正则表达式init应该总是成功。 – Sulthan

1

而不是使用正则表达式,你可以使用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,在我看来,比使用正则表达式的字符串清洁了许多。

+0

这将返回true为空字符串 – Leon

+0

@Leon感谢您指出。我已经更新了示例代码。 –

相关问题