Самый эффективный способ получить первую строку без пробелов из NSTextView? - PullRequest
3 голосов
/ 17 июня 2011

Какой самый эффективный способ извлечь первую строку без пробелов из NSTextView?

Например, если текст:

\n
\n
    \n
         This is the text I want     \n
 \n
Foo bar  \n
\n

Результат будет "Это текст, который я хочу".

Вот что у меня есть:

NSString *content = self.textView.textStorage.string;
NSInteger len = [content length];
NSInteger i = 0;

// Scan past leading whitespace and newlines
while (i < len && [[NSCharacterSet whitespaceAndNewlineCharacterSet] characterIsMember:[content characterAtIndex:i]]) {
    i++;
}
// Now, scan to first newline
while (i < len && ![[NSCharacterSet newlineCharacterSet] characterIsMember:[content characterAtIndex:i]]) {
    i++;
}
// Grab the substring up to that newline
NSString *resultWithWhitespace = [content substringToIndex:i];
// Trim leading and trailing whitespace/newlines from the substring
NSString *result = [resultWithWhitespace stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

Есть ли лучший, более эффективный способ?

Я подумываю о том, чтобы поместить это в метод -textStorageDidProcessEditing: NSTextStorageDelegate, чтобы я мог получить его при редактировании текста. Вот почему я бы хотел, чтобы метод был максимально эффективным.

1 Ответ

6 голосов
/ 17 июня 2011

Просто используйте NSScanner, который предназначен для такого рода вещей:

NSString* output = nil;
NSScanner* scanner = [NSScanner scannerWithString:yourString];
[scanner scanCharactersFromSet:[NSCharacterSet whitespaceAndNewlineCharacterSet] intoString:NULL];
[scanner scanUpToCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:&output];
output = [output stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

Обратите внимание, что намного быстрее, если вы можете сканировать до определенного символа, а не набора символов:

[scanner scanUpToString:@"\n" intoString:&output];
...