2015-10-10 104 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感謝您指出。我已經更新了示例代碼。 –

相關問題