=~
кажется настраиваемым оператором (или, возможно, оператор сопоставления с образцом ~=
отличался в предыдущей версии Swift, но я сомневаюсь, что, поскольку оператор сопоставления с образцом не может обрабатывать сопоставление регулярных выражений или, по крайней мере, не может справиться с ним в Swift 5).
Вы можете заменить =~
на if password.range(of: pattern, options: .regularExpression) != nil
, чтобы проверить, соответствует ли регулярное выражение вашему паролю.
Кроме того, enum
регистры должны быть ниже CamelCase
Полный рабочий код:
enum PasswordStrength: Int {
case none
case weak
case moderate
case strong
static func checkStrength(password: String) -> PasswordStrength {
let len = password.count
var strength: Int = 0
switch len {
case 0:
return .none
case 1...4:
strength += 1
case 5...8:
strength += 2
default:
strength += 3
}
// Upper case, Lower case, Number & Symbols
let patterns = ["^(?=.*[A-Z]).*$", "^(?=.*[a-z]).*$", "^(?=.*[0-9]).*$", "^(?=.*[!@#%&-_=:;\"'<>,`~\\*\\?\\+\\[\\]\\(\\)\\{\\}\\^\\$\\|\\\\\\.\\/]).*$"]
for pattern in patterns {
if password.range(of: pattern, options: .regularExpression) != nil {
strength += 1
}
}
switch strength {
case 0:
return .none
case 1...3:
return .weak
case 4...6:
return .moderate
default:
return .strong
}
}
}
Вы также можете упростить for
l oop, используя предложение where, например:
for pattern in patterns where password.range(of: pattern, options: .regularExpression) != nil {
strength += 1
}