見出し画像

Swiftでプログラミング。 - コレクションの種類 2

Sets セット

セットは、同じタイプの個別の値を順序に関係なくコレクションに格納します。値の順序が重要でない場合、またはそのが1回だけ表示されるようにする必要がある場合は、配列の代わりにセットを使用できます。

SwiftのSetタイプは、FoundationのNSSetクラスにブリッジされます。

Hash Values for Set Types   セットタイプのハッシュ値

セットに格納されるためにはハッシュ値が利用できることが必要とな流のでhashable型である必要があります。ハッシュ値は、等しく比較するすべてのオブジェクトで同じInt値であり、a == bの場合、aのハッシュ値はbのハッシュ値と等いということになります。

ハッシュ値はある計算式で計算された一意の数字、ランダムな重ならない数字という意味です。

Swiftのすべての基本型(String、Int、Double、Boolなど)はデフォルトでhashableであり、setのValueまたは辞書Key型として使用できます。 Enumerationのassociated values も、デフォルトでhashableです。

Swift標準ライブラリのHashableプロトコルに準拠させることで、独自のカスタム型を設定値型または辞書キー型として使用できます。

Set Type Syntax  タイプ構文の設定

Swiftセットのタイプは、Set <Element>として記述されます。ここで、Elementは、セットが格納できる任意の型です。 配列とは異なり、セットには同等の省略形はありません。

Creating and Initializing an Empty Set   空のセットの作成と初期化

初期化構文を使用して、特定のタイプの空のセットを作成できます。

   var letters = Set<Character>()
   print("letters is of type Set<Character> with \(letters.count) items.")
   // Prints "letters is of type Set<Character> with 0 items."
変数lettersの型は、initializer(初期化子)の型からSet <Character>であると推測されます。

または、コードの中で関数の引数や、すでに型指定された変数や定数などの型情報をすでに提供している場合は、空の配列リテラルを使用して空のセットを作成できます。

   letters.insert("a")
   // letters now contains 1 value of type Character
   letters = []
   // letters is now an empty set, but is still of type Set<Character>

Creating a Set with an Array Literal  配列リテラルを使用したセットの作成

1つ以上の値をセットコレクションとして書き込む簡単な方法として、配列リテラルを使用してセットを初期化することもできます。

以下の例では、文字列値を格納するためのfavoriteGenresというセットを作成します。

   var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]
   // favoriteGenres has been initialized with three initial items

FavoriteGenres変数は、Set <String>として記述された「文字列値のセット」として宣言されています。 この特定のセットは文字列値を指定しているため、文字列値のみを格納できます。 ここで、favoriteGenresセットは、配列リテラル内に記述された3つの文字列値( "Rock"、 "Classical"、および "Hip hop")で初期化されます。

以下の例では項目が追加および削除されるため、favoriteGenresセットは定数(let introducerを使用)ではなく変数(var introducerを使用)として宣言されます。

セット型は配列リテラルだけから推測することはできないため、型セットを明示的に宣言する必要があります。 ただし、Swiftの型推論のため、1つの型の値のみを含む配列リテラルで初期化する場合は、セットの要素の型を記述する必要はありません。 代わりに、favoriteGenresの初期化をより短い形式で記述できます。

var favoriteGenres: Set = ["Rock", "Classical", "Hip hop"]

配列リテラルのすべての値は同じ型であるため、SwiftはSet <String>がfavoriteGenres変数に使用する正しい型であると推測できます。

Accessing and Modifying a Set セットへのアクセスと変更

セットにアクセスして変更するには、そのメソッドとプロパティを使用します。

セット内の値の数を確認するには、読み取り専用のcount プロパティでチェックできます。

    print("I have \(favoriteGenres.count) favorite music genres.")
   // Prints "I have 3 favorite music genres."

countプロパティが"0"に等しいかどうかを確認するためのショートカットとして、Boolenの isEmptyプロパティを使用します。

   if favoriteGenres.isEmpty {
       print("As far as music goes, I'm not picky.")
   } else {
       print("I have particular music preferences.")
   }
   // Prints "I have particular music preferences."

セットのinsert(_ :)メソッドを呼び出すことにより、新しい値をセットに追加できます。

   favoriteGenres.insert("Jazz")
   // favoriteGenres now contains 4 items

セットのremove(_ :)メソッドを呼び出すことで、セットから値を削除できます。このメソッドは、値がセットのメンバーである場合はアイテムを削除し、削除された値を返します。セットに値が含まれていない場合はnilを返します。 または、removeAll()メソッドを使用して、セット内のすべての値を削除することもできます。

   if let removedGenre = favoriteGenres.remove("Rock") {
       print("\(removedGenre)? I'm over it.")
   } else {
       print("I never much cared for that.")
   }
   // Prints "Rock? I'm over it."

セットに特定の値が含まれているかどうかを確認するには、contains(_ :)メソッドを使用します。

   if favoriteGenres.contains("Funk") {
       print("I get up on the good foot.")
   } else {
       print("It's too funky in here.")
   }
   // Prints "It's too funky in here."

Iterating Over a Set セットを反復する

for-inループを使用して、セット内の値を反復処理で取り出すことができます。

   for genre in favoriteGenres {
       print("\(genre)")
   }
   // Classical
   // Jazz
   // Hip hop

この記事が気に入ったらサポートをしてみませんか?