Подтвердить что ты не робот

Вызов может вызывать, но он не помечен как "try", и ошибка не обрабатывается: NSRegularExpression

Я написал эту функцию в String Extension и не могу определить ошибку.

func isEmail() -> Bool {
    let regex = NSRegularExpression(pattern: "^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\\.[A-Z]{2,4}$", options: [.CaseInsensitive])

    return regex.firstMatchInString(self, options: nil, range: NSMakeRange(0, characters.count)) != nil
}

Ошибка:

Вызов может вызывать, но он не отмечен "try", и ошибка не обрабатывается.

4b9b3361

Ответ 1

NSRegularExpression(pattern:) выдает ошибку, если шаблон недействителен. В вашем случае шаблон фиксирован, поэтому недопустимый шаблон будет ошибкой программирования.

Это прецедент для выражения "принудительная попытка" с try!:

extension String {
    func isEmail() -> Bool {
        let regex = try! NSRegularExpression(pattern: "^[A-Z0-9._%+-][email protected][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, иначе он может упасть например с символами Эмоджи.

Ответ 2

Это потому, что этот инициализатор теперь может генерировать исключение, поэтому вам нужно try вызвать его и подготовиться к catch исключению. Вы можете сделать это, добавив try перед инициализатором и аннотируя свой метод с помощью throws.

extension String {
    func isEmail() throws -> Bool {
        let regex = try NSRegularExpression(pattern: "^[A-Z0-9._%+-][email protected][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 "[email protected]".isEmail()
} catch {
    print(error)
}

Примечание. Я также обновил ваш вызов regex.firstMatchInString, чтобы отразить тот факт, что параметр options больше не может принимать значение nil.

Ответ 3

Если вам не нравится try 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._%+-][email protected][A-Z0-9.-]+\\.[A-Z]{2,4}$")==true)
{
     print("this is e-mail!")
}

Ответ 4

Вы можете использовать string.rangeOfString и указать параметр .RegularExpressionSearch. Это просто.

func isEmail(email: String) -> Bool {
    return email.rangeOfString("^[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,6}$", options: .RegularExpressionSearch) != nil
}