Невозможно удалить новую строку из Cocoa NSMutableString - PullRequest
0 голосов
/ 23 января 2010

Эй, для жизни меня, это не работает: ..

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);

Оба эти метода я нашел в SO - и они, похоже, не работают ... Я должен что-то делать ужасно неправильно. Но, если я остановлюсь на NSLog, я могу ясно увидеть "\ n" в строке (в отладчике И в консоли вне)

Кроме того, это правда:

if (foundRange.location != NSNotFound)

И я могу видеть, если выполнить метод stringByReplacingOccurencesOfString ...

Ответы [ 3 ]

4 голосов
/ 23 января 2010

Это потому, что метод stringByTrimmingCharactersInSet: возвращает новую строку вместо изменения текущей.

NSString* trimmedString = [b64String stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];
4 голосов
/ 23 января 2010

Просто позвоните

b64String = [b64String stringByReplacingOccurrencesOfString:@"\n" withString:@""]
Достаточно

(не забудьте -release ненужных копий b64string. Возможно, вы захотите сохранить его в другой переменной) или использовать фактический изменяемый метод с полным диапазоном:

[b64String replaceOccurrencesOfString:@"\n" withString:@"" options:0 range:NSMakeRange(0, [b64String length])];

В -stringByReplacingOccurrencesOfString:withString:options:range: параметр range указывает диапазон, в котором происходит замена. Это означает, что ничто не будет заменено вне диапазона. В вашем коде вы передаете диапазон 1-го появления \n. Эффект только 1 вхождения \n будет удален.

Методы stringBy... предназначены для неизменяемых строк. Они не будут изменять входную строку. Вместо этого они создают копию неизменяемой строки и возвращают измененную копию.

0 голосов
/ 09 июля 2017

Вы можете обрезать строки с NSMutableString на месте, но вам нужно использовать метод CFStringTrim от Core Foundation.

Objective-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)
...