2014年6月3日火曜日

Swift言語の入門 (3) コレクション編

SwiftにはArrayとDictionaryの2つのコレクション型があります。

1.Array

  • var shoppingList = ["Eggs", "Milk"]

このように、角括弧で囲い、カンマ区切りで要素を記述していきます。JSONにおける配列の記述の方式と同様です。

また、String型のArrayはArray<String>型となりジェネリクス型として表現されます。これの略記法としてString[]というJavaの配列のような書き方も認められています。

  • println("The shopping list contains \(shoppingList.count) items.")
  • if shoppingList.isEmpty {
  • println("The shopping list is empty.")
  • } else {
  • println("The shopping list is not empty.")
  • }

ArrayはcountやisEmptyといったObjective-Cでも存在していたプロパティを持っています。しかしながら、Objective-Cとの大きな違いとして、変更可能性は配列の型によらず、変数であるかもしくは定数であるかに依存します。すなわち、letで宣言された配列は変更不可で、varの場合には変更が可能です。

配列変数は変更可能であるので、たとえば

  • shoppingList.append("Flour")
  • shoppingList += ["Chocolate Spread", "Cheese", "Butter"]

などと書くことで、配列に要素を追加することができます。


各要素へのアクセスは、従来通り

  • var firstItem = shoppingList[0]

のようにして行い、範囲生成と組み合わせることで、

  • shoppingList[4...6] = ["Bananas", "Apples"]

のように配列の中の特定の範囲をごっそり入れ替えることができます。この例では、4, 5, 6番目(ドットが3つあるので6を含む)の要素を["Bananas", "Apples"]で差し替える(要素の数は一つ減る)、という処理になります。

配列はObjective-CのFast Enumerationのように

  • for item in shoppingList {
  • println(item)
  • }
と書くことで走査することができます。

配列変数を別の変数に代入するときには、基本的には参照が渡され、実体は同じものを参照することになります。ただし、配列の長さを変更するような処理を行ったときに初めて、元の参照している配列からコピーされ、新たな配列が生成されます。

2.ディクショナリ

いわゆる連想配列で、キーとなる型と値となる型の二つをペアにして保持することのできる型です。

  • var airports: Dictionary<String, String> = ["TYO": "Tokyo", "DUB": "Dublin"]

宣言は上記のように行い、ジェネリクスの角括弧を用いてキーと値の型を指定します。
JSONの表記法と似ているようで違うのは、JSONの場合は括弧が[ ] では無く{ }であることくらいでしょうか。

また、型推論を利用して、ジェネリクスの型注釈を省くことも可能です。

値へのアクセスは


  • airports["LHR"] = "London"

のように[ ] の中にキーを記述することで行います。

if letの構文を利用することで、キーがあるかどうかをチェックした上で、その値に関する処理を記述することができます。

  • if let airportName = airports["DUB"] {
  • println("The name of the airport is \(airportName).")
  • } else {
  • println("That airport is not in the airports dictionary.")
  • }

ディクショナリの走査にはFast Enumeration式の方法が利用でき、タプルの形式でキーと値を束縛して処理を書きます。

  • for (airportCode, airportName) in airports {
  • println("\(airportCode): \(airportName)")
  • }

ディクショナリ変数を他の変数に代入する際には、全て参照ではなく値が渡されます。そのため、ディクショナリを代入した後に、もとのディクショナリを編集しても、代入後のディクショナリはもとのまま変化がありません。


総括

  • 配列は基本参照渡し、長さを返るタイミングでコピー
  • ディクショナリは値渡し
  • for .. in で走査