22
22

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.

CocoaAdvent Calendar 2015

Day 14

Swiftで行の分割を簡単に

Last updated at Posted at 2015-12-13

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

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

.txt
Foo
Bar
Baz

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

.swift
["Foo", "Bar", "Baz"]

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

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

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

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

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

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

extensionでさらに便利に

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

.swift
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などと組み合わせてもよし。さらに、改行コードはどちらでも、混ざっていても良いので便利です。

.swift
"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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?