Как получить каждую строку из строки NSString? - PullRequest
7 голосов
/ 05 декабря 2008

Если у меня есть NSString с текстовым файлом, как мне получить NSArray NSString с каждой NSString, содержащей строку файла.

В 10.5 я сделал это:

NSArray* lines = [str componentsSeparatedByCharactersInSet: [NSCharacterSet newlineCharacterSet]];

Но это не работает в 10.4, а моя программа должна работать в 10.4.

Кроме того, он должен работать с окончаниями строк \ r, \ n и \ r \ n.

Ответы [ 6 ]

10 голосов
/ 05 декабря 2008

Следующий код взят из документации Apple относительно параграфов и разрывов строк :

unsigned length = [string length];
unsigned paraStart = 0, paraEnd = 0, contentsEnd = 0;
NSMutableArray *array = [NSMutableArray array];
NSRange currentRange;
while (paraEnd < length)
{
    [string getParagraphStart:&paraStart end:&paraEnd
    contentsEnd:&contentsEnd forRange:NSMakeRange(paraEnd, 0)];
    currentRange = NSMakeRange(paraStart, contentsEnd - paraStart);
    [array addObject:[string substringWithRange:currentRange]];
}

Я не уверен на 100%, будет ли он работать с 10,4

6 голосов
/ 11 декабря 2015

Перечисляет все строки в строке, используя enumerateLinesUsingBlock:

[yourString enumerateLinesUsingBlock:^(NSString * _Nonnull line, BOOL * _Nonnull stop) {
    //line
}];

Декларация

- (void)enumerateLinesUsingBlock:(void (^)(NSString *line,
                                   BOOL *stop))block

Параметры

block Блок, выполненный для перечисления.

Блок принимает два аргумента:

line Текущая строка перечисляемой строки. Линия содержит только содержимое строки, без разделителей строки.

stop Ссылка на логическое значение, которое блок может использовать для остановки перечисление путем установки * stop = YES; это не должно касаться * остановить в противном случае.

Наличие Доступно в OS 10.6 и iOS 4.0 и более поздних версиях.

5 голосов
/ 05 декабря 2008

Сначала я заменю все "\ r" на "\ n", затем заменю все "\ n \ n" на "\ n", а затем сделаю компонент SeparatedByString: @ "\ n".

3 голосов
/ 05 декабря 2008

Прямо с моего проекта:

 NSString * fileContents = [NSString stringWithContentsOfFile:pathToFile encoding:NSUTF8StringEncoding error:nil];
 NSMutableArray * fileLines = [[NSMutableArray alloc] initWithArray:[fileContents componentsSeparatedByString:@"\r\n"] copyItems: YES];

Я не уверен, как заставить это автоматически работать с любым типом строки, заканчивающейся в 10.4.

2 голосов
/ 05 декабря 2008

В соответствии с ссылкой на класс NSString , сообщение NSString componentsSeparatedByCharactersInSet: доступно в OS X 10.5 или более поздней версии. Вам нужно использовать компонентыSeparatedByString:.

0 голосов
/ 20 апреля 2017

Вы также можете сделать enumerateSubstringsInRange: с опциями NSStringEnumerationByLines и / или NSStringEnumerationByParagraphs.

Преимущество такого подхода состоит в том, что вы получаете NSRange каждой подстроки, а также можете установить начальный диапазон строки для перечисления.

[myString enumerateSubstringsInRange:NSMakeRange(0, myString.length) options:NSStringEnumerationByLines | NSStringEnumerationByParagraphs usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop) {

}];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...