ProgrammingiOS開発者

Swiftにおけるデータ型Setについて:その特徴、インターフェース、操作の実行時間、使用時の潜在的な落とし穴、配列(Array)との違いについて教えてください。

Hintsage AIアシスタントで面接を突破

回答

Setは、ハッシュテーブルとして実装された順序のないユニークな要素のコレクションです。Arrayとの主な違いは、重複する値がないことと順序がないことです。主なインターフェース:挿入メソッド(insert)、削除メソッド(remove)、存在確認メソッド(contains)。

実行時間:

  • insertremove、およびcontainsの操作は平均してO(1)で動作します。
  • すべての要素を反復処理するのはO(n)です。

使用例:

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をその順で構築しました。その結果、毎回の実行時に順序が異なり、最終ユーザーにデータが不整合に表示されることにつながりました。