Обратите внимание, что существует более простой способ реализовать то, что вы хотите, используя регулярное выражение:
let currentText = (textField.text ?? "") as NSString
let newText = currentText.replacingCharacters(in: range, with: string)
let pattern = "^[a-zA-Z0-9@$&*!]{0,20}$"
return newText.range(of: pattern, options: .regularExpression) != nil