はじめに
表示領域の節約のために、文字列から改行コード(\r\n
、\n
)を抜いて代わりにスペース(" "
)を入れた文字を表示させるという仕様が、担当しているサービスにありました。
これを簡潔に書くと以下のようになると思います。
let text = "このテキスト内には\n改行コード\r\nが含まれてします。\n"
var noNewLineText = text.stringByReplacingOccurrencesOfString("\r\n", withString: " ", options: [], range: text.startIndex..<text.endIndex)
noNewLineText = noNewLineText.stringByReplacingOccurrencesOfString("\n", withString: " ", options: [], range: noNewLineText.startIndex..<noNewLineText.endIndex)
print(text) //このテキスト内には 改行コード が含まれてします。
同じメソッドを複数回呼び出したり、var
を使って再代入するなどあまりSwiftらしい書き方とは言えないものになってしまっています。
reduceを使う
\n\r
、\n
を配列に持たせて、reduceを使ってみましょう。
let text = "このテキスト内には\n改行コード\r\nが含まれてします。\n"
let noNewLineText = ["\r\n", "\n"].reduce(text) {
return $0.0.stringByReplacingOccurrencesOfString($0.1, withString: " ", options: [], range: $0.0.startIndex..<$0.0.endIndex)
}
print(noNewLineText) //このテキスト内には 改行コード が含まれてします。
初期値をtext
とすることで、初回の$0.0
はtext
となります。その時の$0.1
は\r\n
なので、返す値はtext
中の\r\n
が" "
に置き換えられたString
となります。
そのため、次の$0.0
はtext
中の\r\n
が" "
に置き換えられたString
なので、最終的に出力される値は、text
中の\r\n
と\n
が" "
に置き換えられたString
となります。
このようにreduceでも該当の文字を除外することが簡単にできます。