No estoy seguro de las dos respuestas anteriores cubren los requisitos, por lo que esta es una respuesta que corresponde a una interpretación más estricta de los requisitos.
Tomando los requisitos de los comentarios en el código del post original:
//The string only contains alpha or numerical characters.
//But now I want to check that both character sets are present?
Esto significa que una cadena para pasar la prueba debe consistir sólo números y letras, y al menos uno de cada uno.
NSString
rangeOfCharacterFromSet:
encuentra un carácter en una cadena si pertenece a un conjunto determinado, por lo que podemos usar ese.
NSString *string = // ... string to test;
NSCharacterSet *illegalChars = [[NSCharacterSet alphanumericCharacterSet] invertedSet];
// Test if there is an illegal character in the string
BOOL hasIllegalCharacter = [string rangeOfCharacterFromSet: illegalCharacterSet].location != NSNotFound;
BOOL hasLetter = [string rangeOfCharacterFromSet: [NSCharacterSet letterCharacterSet]].location != NSNotFound;
BOOL hasDigit = [string rangeOfCharacterFromSet: [NSCharacterSet decimalDigitCharacterSet]].location != NSNotFound;
if (hasDigit && hasLetter && !hasIllegalCharacter ) {
// String OK
}
como se detalla en la documentación, el rangeOfCharacterFromSet:
devuelve un NSRange de {NSNotFound, 0} en caso de que ningún personaje de la serie se encuentra en la cadena. Esto es similar a otros métodos para buscar cadenas o caracteres en una cadena en Cocoa.
Sé que es una herejía decir esto, pero la forma más simple, más comprensible y más eficiente de hacer esto es casi con certeza simplemente recorrer la cadena, extraer cada carácter con 'characterAtIndex' y probarlo con los límites apropiados . Con los demás, será mejor que tengas algunos buenos comentarios si quieres entender el código dentro de 6 meses. –