見出し画像

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

Performing Set Operations セット操作の実行

2つのセットを組み合わせるて2つのセットに共通する値を判別することができます。2つのセットに同じ値がすべて含まれるか、一部含まれるか、含まれないかを判別するなど、基本的なセット操作を効率的に実行できます。

Fundamental Set Operations 基本的なセット操作

・intersection 積集合(_ :)メソッドを使用して、両方のセットに共通の値のみを含む新しいセットを作成します。
・symmetricDifference 対称差集合(_ :)メソッドを使用して、両方ではなくいずれかのセットの値を持つ新しいセットを作成します。
・union 和集合(_ :)メソッドを使用して、両方のセットのすべての値を含む新しいセットを作成します。
・subtracting 差集合(_ :)メソッドを使用して、指定されたセットにない値で新しいセットを作成します。
   let oddDigits: Set = [1, 3, 5, 7, 9]
   let evenDigits: Set = [0, 2, 4, 6, 8]
   let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]
   oddDigits.union(evenDigits).sorted()
   // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
   oddDigits.intersection(evenDigits).sorted()
   // []
   oddDigits.subtracting(singleDigitPrimeNumbers).sorted()
   // [1, 9]
   oddDigits.symmetricDifference(singleDigitPrimeNumbers).sorted()
   // [1, 2, 9]

Set Membership and Equality メンバーシップと平等を設定する

a、b、cの3つのセットで、重複する領域はセット間で共有される要素を表しています。 aにはbのすべての要素が含まれているため、セットaはセットbのスーパーセットです。 逆に、bのすべての要素もaに含まれているため、セットbはセットaのサブセットです。 セットbとセットcは、共通の要素を共有していないため、互いに素です。

・is equal「等しい」演算子(==)を使用して、2つのセットにすべて同じ値が含まれているかどうかを判別します。(Aの中にBを全て含んでいるかどうか)
・isSubset(of :)メソッドを使用して、セットのすべての値が指定されたセットに含まれているかどうかを判別します。(Aの中にBの一部を含んでいるかどうか)
・isSuperset(of :)メソッドを使用して、セットに指定されたセットのすべての値が含まれているかどうかを判別します。(BをAが含んでいるかどうか isSubsetの逆)
・isStrictSubset(of :)またはisStrictSuperset(of :)メソッドを使用して、セットがサブセットであるかスーパーセットであるが、指定されたセットと等しくないかを判別します。
・isDisjoint(with :)メソッドを使用して、2つのセットに共通の値がないかどうかを判別します。
   let houseAnimals: Set = ["🐶", "🐱"]
   let farmAnimals: Set = ["🐮", "🐔", "🐑", "🐶", "🐱"]
   let cityAnimals: Set = ["🐦", "🐭"]
   houseAnimals.isSubset(of: farmAnimals)
   // true
   farmAnimals.isSuperset(of: houseAnimals)
   // true
   farmAnimals.isDisjoint(with: cityAnimals)
   // true

Dictionaries 辞書

ディクショナリは、同じタイプのキーと同じタイプの値の間の関連付けを、定義された順序なしでコレクションに格納します。 各値は一意のキーに関連付けられており、ディクショナリ内でその値の識別子として機能します。 配列内のアイテムとは異なり、ディクショナリ内のアイテムには指定された順序がありません。 識別子に基づいて値を検索する必要がある場合は、実際の辞書を使用して特定の単語の定義を検索するのとほぼ同じ方法で、辞書を使用します。

Swiftの辞書タイプはFoundationのNSDictionaryクラスにブリッジされます。

Dictionary Type Shorthand Syntax 辞書タイプ省略構文

Swiftディクショナリの型は、Dictionary <Key、Value>として記述されます。ここで、KeyはディクショナリKeyとして使用できる値の型であり、ValueはディクショナリがそれらのKeyに対して格納する値の型です。

ディクショナリのKey型は、セットのValueと同様に、Hashableプロトコルに準拠している必要があります。

辞書のタイプを[Key : Value]のように省略形で記述することもできます。 2つの形式は機能的には同じですが、省略形が推奨され、辞書の型を参照するときにこのガイド全体で使用されます。

Creating an Empty Dictionary 空の辞書の作成

配列と同様に、初期化構文を使用して、特定の型の空のディクショナリを作成できます。

    var namesOfIntegers = [Int: String]()
   // namesOfIntegers is an empty [Int: String] dictionary

この例では、[Int:String]型の空の辞書を作成して、人間が読める整数値の名前を格納します。 そのKeyはInt型であり、値はString型です。

コードの中で型情報を提供している場合は、空の辞書リテラルを使用して空の辞書を作成できます。これは、[:](角括弧のペア内のコロン)として記述されます。

    namesOfIntegers[16] = "sixteen"
   // namesOfIntegers now contains 1 key-value pair
   namesOfIntegers = [:]
   // namesOfIntegers is once again an empty dictionary of type [Int: String]

Creating a Dictionary with a Dictionary Literal 辞書リテラルを使用した辞書の作成

また、前に見た配列リテラルと同様の構文を持つ辞書リテラルを使用して辞書を初期化することもできます。 ディクショナリリテラルは、1つ以上のキーと値のペアをディクショナリコレクションとして記述するための簡単な方法です。

キーと値のペアは、KeyとValueの組み合わせです。 辞書リテラルでは、各キーと値のペアのKeyとValueはコロンで区切られます。 KeyとValueのペアは、コンマで区切られ、角かっこで囲まれたリストとして記述されます。

[Key1:Value1、Key2:Value2、Key3:Value3]

以下の例では、国際空港の名前を格納するための辞書を作成します。 この辞書では、Keyは3文字の国際航空運送協会のコードであり、値は空港名です。

var airports: [String: String] = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]

変数airportsで定義される辞書は、型が[String:String]であると宣言されています。これは、「KeyがString型であり、ValueもString型である辞書」を意味します。

以下の例では、より多くの空港が変数airports(辞書)に追加されているため、変数airports(辞書)は定数(let introducerを使用)ではなく、変数(var introducerを使用)として宣言されています。

変数airports(辞書)は、2つのキーと値のペアを含む辞書リテラルで初期化されます。最初のペアのキーは「YYZ」で、値は「TorontoPearson」です。 2番目のペアには、「DUB」のキーと「Dublin」の値があります。

この辞書リテラルには、2つの文字列:文字列ペアが含まれています。このKey-Value型は、airports変数宣言の型(String Keyのみ、String Valueのみの辞書)と一致するため、2つの初期項目でairports辞書を初期化する方法として、辞書リテラルの割り当てが許可されます。

配列と同様に、KeyとValueの型が一貫している辞書リテラルで初期化する場合は、辞書の型を記述する必要はありません。変数airportsの初期化は、代わりに短い形式で記述されている可能性があります。

var airports = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]

リテラル内のすべてのKeyは互いに同じ型であり、同様にすべての値は互いに同じ型であるため、Swiftは[String:String]が変数airports(辞書)に使用する正しい型であると推測できます。

Accessing and Modifying a Dictionary 辞書へのアクセスと変更

辞書にアクセスして変更するには、そのメソッドとプロパティを使用するか、添え字構文を使用します。

配列の場合と同様に、読み取り専用のcountプロパティで、辞書内の値の数を確認できます。

    print("The airports dictionary contains \(airports.count) items.")
   // Prints "The airports dictionary contains 2 items."

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

    if airports.isEmpty {
       print("The airports dictionary is empty.")
   } else {
       print("The airports dictionary isn't empty.")
   }
   // Prints "The airports dictionary isn't empty."

添え字構文を使用して、辞書に新しい項目を追加できます。 適切な型の新しいKeyを添え字インデックスとして使用し、適切な型の新しい値を割り当てます。

    airports["LHR"] = "London"
   // the airports dictionary now contains 3 items

添え字構文を使用して、特定のKeyに関連付けられているValueを変更することもできます。

    airports["LHR"] = "London Heathrow"
   // the value for "LHR" has been changed to "London Heathrow"

添え字を付ける代わりに、辞書のupdateValue(_:forKey :)メソッドを使用して、特定のKeyのValueを設定または更新します。 上記の添え字の例のように、updateValue(_:forKey :)メソッドは、Keyが存在しない場合はキーの値を設定し、Keyがすでに存在する場合はValueを更新します。 ただし、添え字とは異なり、updateValue(_:forKey :)メソッドは、更新の実行後に古い値を返します。 これにより、更新が行われたかどうかを確認できます。

updateValue(_:forKey :)メソッドは、ディクショナリの値型のオプションの値を返します。 たとえば、文字列値を格納するディクショナリの場合、メソッドは型 String?または「オプションの文字列」の値を返します。 このオプションの値には、更新前にKeyが存在していた場合はそのKeyの古いValueが含まれ、Valueが存在しなかった場合はnilが含まれます。

    if let oldValue = airports.updateValue("Dublin Airport", forKey: "DUB") {
       print("The old value for DUB was \(oldValue).")
   }
   // Prints "The old value for DUB was Dublin."

添え字構文を使用して、特定のKeyのディクショナリからValueを取得することもできます。 Valueが存在しないKeyを要求できるため、ディクショナリの添え字は、ディクショナリのValueタイプのオプションのValueを返します。 ディクショナリに要求されたKeyのValueが含まれている場合、添え字はそのKeyの既存のValueを含むオプションの値を返します。 それ以外の場合、添え字はnilを返します。

    if let airportName = airports["DUB"] {
       print("The name of the airport is \(airportName).")
   } else {
       print("That airport isn't in the airports dictionary.")
   }
   // Prints "The name of the airport is Dublin Airport."

添え字構文を使用して、KeyにnilのValueを割り当てることにより、KeyとValueのペアを辞書から削除できます。

    airports["APL"] = "Apple International"
   // "Apple International" isn't the real airport for APL, so delete it
   airports["APL"] = nil
   // APL has now been removed from the dictionary

または、removeValue(forKey :)メソッドを使用して、KeyとValueのペアを辞書から削除します。 このメソッドは、KeyとValueのペアが存在する場合は削除して削除したValueを返し、Valueが存在しない場合はnilを返します。

   if let removedValue = airports.removeValue(forKey: "DUB") {
       print("The removed airport's name is \(removedValue).")
   } else {
       print("The airports dictionary doesn't contain a value for DUB.")
   }
   // Prints "The removed airport's name is Dublin Airport."

Iterating Over a Dictionary 辞書を反復処理する

for-inループを使用して、辞書内のキーと値のペアを反復処理できます。 ディクショナリ内の各アイテムは(Key、Value)タプルとして返され、反復の一部としてタプルのメンバーを一時的な定数または変数に分解できます。

   for (airportCode, airportName) in airports {
       print("\(airportCode): \(airportName)")
   }
   // LHR: London Heathrow
   // YYZ: Toronto Pearson

KeyとValueのプロパティにアクセスして、ディクショナリのKeyまたはValueの反復可能なコレクションを取得することもできます。

    for airportCode in airports.keys {
       print("Airport code: \(airportCode)")
   }
   // Airport code: LHR
   // Airport code: YYZ
   for airportName in airports.values {
       print("Airport name: \(airportName)")
   }
   // Airport name: London Heathrow
   // Airport name: Toronto Pearson

Arrayインスタンスを取得するAPIで辞書のKeyまたは値を使用する必要がある場合は、keysまたはvaluesプロパティを使用して新しい配列を初期化します。

   let airportCodes = [String](airports.keys)
   // airportCodes is ["LHR", "YYZ"]
   let airportNames = [String](airports.values)
   // airportNames is ["London Heathrow", "Toronto Pearson"]

Swiftの辞書型には定義された順序がありません。 辞書のKeyまたはValueを特定の順序で反復処理するには、そのKeyまたはValueプロパティでsorted()メソッドを使用します。


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