Вот вариант проверки пароля без регулярного выражения, я бы сказал, что его легче читать и поддерживать, чем решение с регулярным выражением.
func isValid(password: String) -> Bool {
return (8...30).contains(password.count) &&
password.rangeOfCharacter(from: .uppercaseLetters) != nil &&
password.rangeOfCharacter(from: .decimalDigits) != nil &&
password.rangeOfCharacter(from: .punctuationCharacters) != nil &&
!password.lowercased().contains("password")
}
Обратите внимание, что в вашем примере вы говорите, что " turkey90AAA = "должен возвращать истину, но '=' не является знаком препинания, поэтому приведенный выше код его не примет. Вместо этого этот символ является символом, поэтому, если вы хотите включить его, добавьте также проверку на набор символов .symbols
, password.rangeOfCharacter(from: .symbols) != nil