调用可以抛出,但是没有标上'try',不处理错误:NSRegularExpression
Call can throw, but it is not marked with 'try' and the error is not handled: NSRegularExpression
我在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
}
错误是:
Call can throw, but it is not marked with 'try' and the error is not handled
那是因为该初始化器现在可以抛出异常,所以您需要 try
调用它并准备好 catch
异常。您可以通过在初始化程序之前添加 try
并使用 throws
.
注释您的方法来做到这一点
extension String {
func isEmail() throws -> Bool {
let regex = try NSRegularExpression(pattern: "^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$", options: [.CaseInsensitive])
return regex.firstMatchInString(self, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, characters.count)) != nil
}
}
然后当你想调用该方法时,从 do
块中调用并捕获出现的错误。
do {
try "person@email.com".isEmail()
} catch {
print(error)
}
注意:我还更新了您的 regex.firstMatchInString
调用,以反映 options
参数不能再采用 nil 值这一事实。
如果模式无效,NSRegularExpression(pattern:)
会抛出错误。在您的情况下,模式是 fixed,因此模式无效
将是编程错误。
这是 "forced-try" 表达式的用例 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
,否则可能会崩溃
例如带有表情符号字符。
如果你不喜欢尝试捕捉:
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 = "checkthis@gmail.com"
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
}
我在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
}
错误是:
Call can throw, but it is not marked with 'try' and the error is not handled
那是因为该初始化器现在可以抛出异常,所以您需要 try
调用它并准备好 catch
异常。您可以通过在初始化程序之前添加 try
并使用 throws
.
extension String {
func isEmail() throws -> Bool {
let regex = try NSRegularExpression(pattern: "^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$", options: [.CaseInsensitive])
return regex.firstMatchInString(self, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, characters.count)) != nil
}
}
然后当你想调用该方法时,从 do
块中调用并捕获出现的错误。
do {
try "person@email.com".isEmail()
} catch {
print(error)
}
注意:我还更新了您的 regex.firstMatchInString
调用,以反映 options
参数不能再采用 nil 值这一事实。
NSRegularExpression(pattern:)
会抛出错误。在您的情况下,模式是 fixed,因此模式无效
将是编程错误。
这是 "forced-try" 表达式的用例 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
,否则可能会崩溃
例如带有表情符号字符。
如果你不喜欢尝试捕捉:
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 = "checkthis@gmail.com"
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
}