以前にかいた記事 の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)
// => []