モダンな配列処理が得意なswiftですが、公式パッケージであるSwift-Collectionsを導入することでさらにモダンでスマートなコードを書くことができます。
Swift Package Managerで導入できます。
https://github.com/apple/swift-collections/
各コレクションについて
順番に動作を見ていきます。
Deque
Dequeは、先頭にもデータを追加できる配列です。
reduceのような標準の配列の機能も使えるようです。
import Collections
var deque: Deque<Int> = [2, 3]
deque.prepend(1)
deque.append(4)
print(deque)
// [1, 2, 3, 4]
let reduce = deque.reduce(0, +)
print(reduce)
// 10
// [1, 2, 3, 4]
標準のArrayでもinsertで同様の実装ができますが、Dequeのprependで実装した方が高速に動作するようです。
OrderedSet
swiftのSetは順序が保持されませんが、OrderedSetなら元の順番を保持してくれます。
重複を削除したくて、かつ順序を変更したくないという場面は時々出てくるので使い道は多そうです。
import Collections
var array = [1, 2, 1, 3, 2, 4, 5, 4, 7]
let set = Set(array)
let orderedSet = OrderedSet(array)
print(set, orderedSet)
// [1, 5, 4, 2, 7, 3] [1, 2, 3, 4, 5, 7]
OrderedDictionary
まずswiftの辞書型についてですが、順序が保持されません。
import Collections
var dictionary: [String: Int] = [:]
dictionary["a"] = 1
dictionary["b"] = 2
dictionary["c"] = 3
print(dictionary)
// 実行する度に順序が変わる。
// ["b": 2, "a": 1, "c": 3]や、["c": 3, "a": 1, "b": 2]など
OrderedDictionaryなら順序も保持されます。
import Collections
var dictionary: OrderedDictionary<String, Int> = [:]
dictionary["a"] = 1
dictionary["b"] = 2
dictionary["c"] = 3
print(dictionary)
// ["a": 1, "b": 2, "c": 3]
インデックス指定で順序入れ替えるメソッドも用意されています。
import Collections
var dictionary: OrderedDictionary<String, Int> = [:]
dictionary["a"] = 1
dictionary["b"] = 2
dictionary["c"] = 3
dictionary.swapAt(1, 2)
print(dictionary)
// ["a": 1, "c": 3, "b": 2]
まとめ
汎用性の高いものというより、ピタッとハマればスマートにかけそうなものが多い印象です。
他にもまだ紹介しきれていないコレクションはたくさんありますので、興味のある方は調べてみると良いかもしれません。