No se puede despojar de nueva línea de cacao NSMutableString
-
22-09-2019 - |
Pregunta
Hola, para la vida de mí, esto no está funcionando: ..
NSMutableString *b64String = [[[NSMutableString alloc] initWithFormat:@"Basic %@", [string _base64Encoding:string]] autorelease];
[b64String stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];
NSLog(@"(%@)", b64String);
NSRange foundRange = [b64String rangeOfString:@"\n"];
if (foundRange.location != NSNotFound)
[b64String stringByReplacingOccurrencesOfString:@"\n"
withString:@""
options:0
range:foundRange];
NSLog(@"(%@)", b64String);
Tanto los métodos que he encontrado en SO - y ellos no parecen funcionar ... tengo que estar haciendo algo mal, muy mal. Pero, si rompo en la NSLog de, puedo ver claramente el "\ n" en la cadena (en el depurador y en el cabo de la consola)
Además, esto es cierto:
if (foundRange.location != NSNotFound)
Y puedo ver si ejecutar el método stringByReplacingOccurencesOfString ...
Solución
Simplemente llame
b64String = [b64String stringByReplacingOccurrencesOfString:@"\n" withString:@""]
es suficiente (recuerda a -release
copias innecesarias de b64string
Es posible que desee almacenar en otra variable.) O que utilice el método mutable real con toda la gama:
[b64String replaceOccurrencesOfString:@"\n" withString:@"" options:0 range:NSMakeRange(0, [b64String length])];
En -stringByReplacingOccurrencesOfString:withString:options:range:
, el parámetro range
especifica el intervalo en el que se produce la sustitución. Eso no significa nada conseguirá fuera del rango reemplazado. En su código, se pasa el rango de la primera aparición de \n
. El efecto es sólo 1 ocurrencia de \n
será eliminado.
Los métodos stringBy...
son para las cadenas inmutables. No modificarán la cadena de entrada. En su lugar, crean una copia de la cadena inmutable y devolver la copia modificada.
Otros consejos
Esto es porque el stringByTrimmingCharactersInSet:
método devuelve una nueva cadena en lugar de modificar la actual.
NSString* trimmedString = [b64String stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];
Puede recortar las nuevas líneas de un NSMutableString
en el lugar, pero hay que utilizar el método CFStringTrim de la Fundación Core.
Objetivo-C:
NSMutableString *string = [NSMutableString stringWithString:@"\nfoo bar baz\n"];
CFStringTrim((__bridge CFMutableStringRef)string, (__bridge CFStringRef)@"\n");
Swift:
let string = NSMutableString(string: "\nfoo bar baz\n")
CFStringTrim(string as CFMutableString, "\n" as CFString)