Setは、ハッシュテーブルとして実装された順序のないユニークな要素のコレクションです。Arrayとの主な違いは、重複する値がないことと順序がないことです。主なインターフェース:挿入メソッド(insert)、削除メソッド(remove)、存在確認メソッド(contains)。
実行時間:
insert、remove、およびcontainsの操作は平均してO(1)で動作します。使用例:
var numbers: Set<Int> = [1, 2, 3] numbers.insert(4) // Set: 1, 2, 3, 4 numbers.insert(2) // Setは変わらず、2は既に存在します numbers.remove(1) // Set: 2, 3, 4 print(numbers.contains(3)) // true
ユニークさが重要であり、順序が重要でない場合はSetを使用してください。Arrayとの比較:
Arrayでは要素の削除と検索はO(n)で行われます。Arrayでは同じ値が許可されています。Setは: ∪, ∩, −, ⊆, ⊇ およびその他の集合論的操作をサポートします。
質問:
次のコードはコンパイルされるでしょうか、なぜですか?
let set: Set = [[1, 2], [3, 4]]
回答:
いいえ、コンパイルされません。Setは要素の型がHashableプロトコルに準拠している必要があります。配列(Array)はHashableを実装していないため、配列の集合を直接作成することはできません。例えば、Set<Int>は正しいですが、Set<[Int]>は正しくありません。
逸話
あるサービスでは、開発者がオブジェクトのユニークなIDを[Int]として保存していましたが、Set<Int>ではありませんでした。これにより問題が発生しました:存在確認と削除が遅く(時間はO(n))、重複が発生し、ビジネスロジックが破綻しました。
逸話
Setに標準外の型を入れようとした(例えばSet<MyModel>を作成したが)ため、型はHashableを実装していませんでした。関連するプロトコルを追加した後にコードはコンパイルされましたが、hash(into:)の実装に誤りがあると衝突や予期しない動作が発生しました。
逸話
開発者は、Setの要素の反復順序が挿入順序と一致することを期待してUIをその順で構築しました。その結果、毎回の実行時に順序が異なり、最終ユーザーにデータが不整合に表示されることにつながりました。