1. Qiita
  2. 投稿
  3. Objective-C

NSStringの行分割の落とし穴

  • 65
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

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; とポインタを通して通知すればいい。
これでめでたく解決である。