LoginSignup
0
3

More than 1 year has passed since last update.

Swiftの文字列や配列の拡張まとめ

Last updated at Posted at 2021-05-05

できること

  1. スペース埋め、ゼロ埋め、左寄せ
    "ABC" -> "__ABC"
    "ABC" -> "00ABC"
    "ABC" -> "ABC__"

  2. n文字ごとに区切る
    "ABCDEFG" -> ["AB", "CD", "EF", "G"]

  3. 重複する要素ががあるかないか
    ["A", "B", "C"] -> false
    ["A", "A", "B"] -> true

  4. 配列を区切って二次元配列にする
    ["A", "B", "C", "D", "E", "F", "G"]
    ->
    [["A", "B"], ["C", "D"], ["E", "F"], ["G"]]

  5. 要素数チェックをしながらオプショナル型で取り出す
    ["A", "B", "C"][at: 2] -> "C" (Optional)
    ["A", "B", "C"][at: 3] -> nil

コピペ用

それぞれ独立しているので、欲しいやつだけコピペしていってね

Extension.swift
// 1. スペース埋め、ゼロ埋め、左寄せ
extension String {
    func padding(to count: Int, with pad: String = " ", isTrailing: Bool = true) -> String {
        let main = String(self.prefix(count))
        let pads = String(repeating: pad, count: count - main.count)
        return isTrailing ? (pads + main) : (main + pads)
    }
}

// 2. n文字ごとに区切る
extension String {
    func split(by count: Int) -> [String] {
        let arrayValue = Array(self)
        if arrayValue.isEmpty { return [] }
        var parent: [[Element]] = []
        for i in 1 ... arrayValue.count {
            if (i % count == 0) {
                parent.append(arrayValue[(i - count)...(i - 1)].map{$0})
            }
        }
        if arrayValue.count % count != 0 { parent.append(arrayValue.suffix(arrayValue.count % count)) }
        return parent.map({String($0)})
    }
}

// 3. 重複する要素ががあるかないか
extension Array where Element: Hashable {
    var hasDuplicated: Bool {
        return Set(self).count != self.count
    }
}

// 4. 配列を区切って二次元配列にする
extension Array {
    func split(by count:Int) -> [[Element]] {
        if self.isEmpty { return [] }
        var parent: [[Element]] = []
        for i in 1 ... self.count {
            if (i % count == 0) {
                parent.append(self[(i - count)...(i - 1)].map{$0})
            }
        }
        if self.count % count != 0 { parent.append(self.suffix(self.count % count)) }
        return parent
    }
}

// 5. 要素数チェックをしながらオプショナル型で取り出す
extension Array {
    /// Optional<Elemnt> として取り出す
    subscript (at index: Index) -> Element? {
        return indices.contains(index) ? self[index] : nil
    }
}

使い方

Sample.swift
// 1. スペース埋め、ゼロ埋め、左寄せ
let a = "ABC".padding(to: 5)
let b = "ABC".padding(to: 5, with: "0")
let c = "ABC".padding(to: 5, isTrailing: false)
let d = "ABC".padding(to: 5, with: "0", isTrailing: false)
// a: "  ABC"
// b: "00ABC"
// c: "ABC  "
// d: "ABC00"

// 2. n文字ごとに区切る        
let e = "ABCDEFG".split(by: 2)
// e: ["AB", "CD", "EF", "G"]

// 3. 重複する要素ががあるかないか
let f = ["A", "B", "C"].hasDuplicated
let g = ["A", "A", "C"].hasDuplicated
// f: false
// g: true

// 4. 配列を区切って二次元配列にする
let h = ["A", "B", "C", "D", "E", "F", "G"].split(by: 2)
// [["A", "B"], ["C", "D"], ["E", "F"], ["G"]]

// 5. 要素数チェックをしながらオプショナル型で取り出す
let i = ["A", "B", "C"][at: 2]
let j = ["A", "B", "C"][at: 3]
// i: "C" (Optional)
// j: nil

さいごに

どれも調べたら出てきそうですが、一箇所にまとめておきたかったので。

0
3
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
0
3