NSStringを行分割したい。割とある気がします。
手っ取り早く回答が欲しい方は一番下へどうぞ。
しかしこの改行コードはくせ者であり、なかなか面倒な面がある。
まず最初に考えるのは
NSArray *lines = [string componentsSeparatedByString:@"\n"];
だが当然これはまずい。
なぜなら改行コードは一つではないからだ。
ではこれではどうだろうか
NSArray *lines = [string componentsSeparatedByCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"\r\n"]];
またもっとしっかりと書いて、
NSArray *lines = [string componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];
一見すると良さそうに見えるが、これでも良くない。
なぜなら、@"aaa\r\nbbb" などといった文字列がくると、
どうも @"aaa", @"", @"bbb"と3つに分割してしまうのだ。
じゃあ@""のは除外しちゃおう!
というのは非常によくない。
なぜなら除外すると、単なる改行だけの行もなかったことにされてしまうからだ。
するともはや自分で1文字1文字パースしていくしかないんじゃないかとすら思えてくる。
しかし、アップルのドキュメントはしっかり読むべきである。
ずばりなメソッドをつかうのが正解のようだ。
NSMutableArray *lines = [NSMutableArray array];
[string enumerateLinesUsingBlock:^(NSString *line, BOOL *stop) {
[lines addObject:line];
}];
もし行の途中でやめたくなったら *stop = YES; とポインタを通して通知すればいい。
これでめでたく解決である。