Невозможно удалить новую строку из какао NSMutableString

Эй, хоть убей, это не работает: ..

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's, я могу ясно увидеть "\ n" в строке (в отладчике И в консоли)

Также это правда:

if (foundRange.location != NSNotFound)

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


person mr-sk    schedule 23.01.2010    source источник
comment
Вы имеете в виду какао NSMutableString. Objective-C - это язык; NSMutableString происходит от framework Какао. Ваш вопрос не будет сильно отличаться на другом языке (например, Ruby или Python), но он не будет иметь никакого отношения к другой структуре (например, стандартной библиотеке .NET или Python).   -  person Peter Hosey    schedule 23.01.2010
comment
Спасибо, Питер, за исправление. Обновлен OP.   -  person mr-sk    schedule 04.02.2010


Ответы (3)


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

b64String = [b64String stringByReplacingOccurrencesOfString:@"\n" withString:@""]

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

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

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

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

person kennytm    schedule 23.01.2010
comment
Не работает - [b64String stringByReplacingOccurrencesOfString: @ \ n withString: @]; NSLog (@ (% @), b64String); \ N все еще там ... - person mr-sk; 23.01.2010
comment
@ Mr-sk: Смотрите обновление. У вашего stringByTrimmingCharactersInSet: тоже есть проблема, см. Другой ответ. - person kennytm; 23.01.2010

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

NSString* trimmedString = [b64String stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];
person zneak    schedule 23.01.2010
comment
Дох! Спасибо, ребята - надо было немного притормозить, чтобы прочитать. хе - person mr-sk; 23.01.2010

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

Цель-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)
person Rick    schedule 08.07.2017