この関数をString Extensionで記述しましたが、エラーを理解できません。
func isEmail() -> Bool {
let regex = NSRegularExpression(pattern: "^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}$", options: [.CaseInsensitive])
return regex.firstMatchInString(self, options: nil, range: NSMakeRange(0, characters.count)) != nil
}
エラーは次のとおりです。
呼び出しはスローできますが、「try」でマークされておらず、エラーは処理されません
パターンが無効な場合、NSRegularExpression(pattern:)
はエラーをスローします。あなたの場合、パターンはfixedなので、無効なパターンはprogramming errorになります。
これは、_try!
_を使用した「強制試行」式のユースケースです。
_extension String {
func isEmail() -> Bool {
let regex = try! NSRegularExpression(pattern: "^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}$",
options: [.CaseInsensitive])
return regex.firstMatchInString(self, options:[],
range: NSMakeRange(0, utf16.count)) != nil
}
}
_
_try!
_はエラー伝播を無効にして、メソッドがエラーをスローしないようにします(呼び出し側がキャッチする必要があります)。パターンが無効な場合、ランタイム例外で中止され、プログラミングエラーを早期に発見するのに役立ちます。
NSRange()
はNSString
の長さ、つまりUTF-16コードポイントの数をカウントするため、_characters.count
_は_utf16.count
_でなければなりません。絵文字を使用します。
Catchが気に入らない場合:
extension String {
func matchPattern(patStr:String)->Bool {
var isMatch:Bool = false
do {
let regex = try NSRegularExpression(pattern: patStr, options: [.CaseInsensitive])
let result = regex.firstMatchInString(self, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, characters.count))
if (result != nil)
{
isMatch = true
}
}
catch {
isMatch = false
}
return isMatch
}
}
チェック文字列は正しいメール形式です:
let emailInput:String = "[email protected]"
if (emailInput.matchPattern("^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}$"))
{
print("this is e-mail!")
}
String.rangeOfStringを使用して、.RegularExpressionSearchにオプションを指定できます。簡単です。
func isEmail(email: String) -> Bool {
return email.rangeOfString("^[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}$", options: .RegularExpressionSearch) != nil
}