Вызов может вызывать, но он не помечен как "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", и ошибка не обрабатывается.
Ответы
Ответ 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
}