LoginSignup
22
22

More than 5 years have passed since last update.

Swiftで行の分割を簡単に

Last updated at Posted at 2015-12-13

改行コードを含んだ文字列を分割する場合

ファイルなどから読み込んだ文字列が改行コードを含む複数行だった場合に、これを改行コードを含まない単数行のArrayにしたい…なんて場合があったとします。

Foo
Bar
Baz

これをこんな感じに扱いたいわけです。

["Foo", "Bar", "Baz"]

ある人はこう言います。「componentsSeparatedByString()」を使えば、綺麗に分割してくれるよ。」

var string = "Foo\rBar\rBuz"
let lines = string.componentsSeparatedByString("\r")
print(lines) // "["Foo", "Bar", "Buz"]

しかし別の人はこう返します。「でも元のテキストの改行コードが"\n"の場合は、分割されないね。さらに"\r\n"の場合は、行頭に"\n"がついちゃう場合があるね?」

var string = "Foo\r\nBar\r\nBuz"
let lines = string.componentsSeparatedByString("\r")
print(lines) // "["Foo", "Bar", "Buz"]

このように、改行コードによる行の分割は、意外と面倒な事がわかります。もちろん力業で文字列をパースして分割しても誰も文句は言いませんが、もう少しすっきりさせたいものです。そんな時は、enumerateLines()を使うと便利です。

let string = "Foo\rBar\rBuz"
var lines = [String]()
string.enumerateLines { (line, stop) -> () in
    lines.append(line)
}
print(lines) // "["Foo", "Bar", "Buz"]

extensionでさらに便利に

このコードをさらに extension にすれば…

extension String {

    var lines: [String] {
        var lines = [String]()
        self.enumerateLines { (line, stop) -> () in
            lines.append(line)
        }
        return lines
    }

}

.linesをつければ、1行毎に分割してArrayにしてくれるので、for-in ループで回してもよし、map,reduce,filterなどと組み合わせてもよし。さらに、改行コードはどちらでも、混ざっていても良いので便利です。

"Foo\rBar\rBuz".lines // ["Foo", "Bar", "Buz"]
"Foo\nBar\nBuz".lines // ["Foo", "Bar", "Buz"]
"Foo\r\nBar\r\nBuz".lines // ["Foo", "Bar", "Buz"]

enumerateLines()を知っていれば、どうって事ないのですが、知っていたのに忘れている場合もありますので、お役に立てれば幸いです。

では、 have a nice coding!

22
22
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
22
22