【Swift3】文字列を指定した長さずつ分割する

Monday, October 10, 2016

以前にかいた記事 のSwift3バージョンになります。
文字列を指定した長さで分割して配列にしてみます。

StringのExtensionとして実装する

extension String {
    public func split(_ length: Int) -> [String] {
        guard length > 0 else {
            return []
        }
        let array = self.characters.map { "\($0)" }
        let limit = array.count
        return stride(from: 0, to: limit, by: length).map {
            array[$0..<min($0.advanced(by: length), limit)].joined(separator: "")
        }
    }
}

ポイントとしては、

  • 一度文字列を、1文字ずつの配列に変換する
  • stride(from:to:by:) を活用する
  • min($0.advanced(by: length), limit) で、範囲外アクセスを防ぐ ※1
  • lengthが0の時は、空配列を返す ※2

となります。特に、 ※1 の箇所を忘れると、指定した長さずつぴったり分割出来ない時にクラッシュします。
また、 ※2 も考慮しておかないと、0文字分割しようとして、 stride(from:to:by:) の箇所でクラッシュします。

使用

extensionとして実装したので、文字列に対して split(_:) を呼んであげます。

_ = "hello, world!".split(3)
// => ["hel", "lo,", " wo", "rld", "!"]
_ = "hello, world!".split(20)
// => ["hello, world!"]
_ = "hello, world!".split(0)
// => []
techSwiftSwift3.0

Firebase RemoteConfigをSwiftで扱いやすくするライブラリを書いてみました

【Swift3】navigationControllerのpopViewControllerで警告がでる