63
61

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

NSStringの行分割の落とし穴

Last updated at Posted at 2012-10-19

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

63
61
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
63
61

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?