调用可以抛出,但它没有标记为'try'并且没有处理错误:NSRegularExpression

Sah*_*oor 28 ios swift swift3

我已在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
}
Run Code Online (Sandbox Code Playgroud)

错误是:

调用可以抛出,但它没有标记为'try',并且没有处理错误

Mar*_*n R 55

NSRegularExpression(pattern:)如果模式无效,则抛出错误.在您的情况下,模式是固定的,因此无效模式将是编程错误.

这是"强制尝试"表达式的用例,包括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
    }
}
Run Code Online (Sandbox Code Playgroud)

try!禁用错误传播,以便该方法不会抛出错误(调用者必须捕获).如果模式无效,它将以运行时异常中止,这有助于尽早发现编程错误.

另请注意,NSRange()计算长度NSString,即UTF-16代码点的数量, characters.count应该是utf16.count,否则它可能会崩溃,例如使用表情符号字符.


Mic*_*lum 13

那是因为初始化程序现在可以抛出异常,所以你需要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
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,当您想要调用方法时,从do块中执行它并捕获出现的错误.

do {
    try "person@email.com".isEmail()
} catch {
    print(error)
}
Run Code Online (Sandbox Code Playgroud)

注意:我还更新了您的regex.firstMatchInString调用,以反映options参数不再为零值的事实.