Вы проверяете, совместим ли шаблон с самим собой, вместо проверки пароля:
return [passwordValidation evaluateWithObject:passwordRegex];
=>
return [passwordValidation evaluateWithObject:passwordString];
Если бы вы назвали свои переменные по-другому:
- (BOOL)validPassword:(NSString *)stringToValidate {
NSString *pattern = @"(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9]{8,20}"; //regex string condition
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
return [predicate evaluateWithObject:stringToValidate];
}
Это могло бы быть более очевидным.
Поскольку вы работаете с небольшим методом с 2 переменными и 1 параметром, называя вашу переменную, начинающуюся с той же последовательности ( пароль FollwedBySomething), становится труднее увидеть, когда вы поместили одну из них на место.