配列は、順序付きのリストに同じ型の値を格納します。配列内に同じ値を格納することができます。
Swift の Array
型は、Foundation の NSArray
クラスとつながっています。
Foundation と Cocoa での Array
の使用についての詳細は、『Using Swift with Cocoa and Objective-C』を確認してください。
配列型の簡略シンタックス
Swift での配列の型は、Element
が配列に格納できる値の型としたとき、Array<Element>
と記述します。配列の型を [Element]
と簡略して書くこともできます。2 つの形式は機能的には同じですが、簡略形式のほうが好ましく、このガイドでは全体をとおして配列の型を参照するときに簡略形式を用いています。
空配列を生成
イニシャライザシンタックスを使用して、型を持つ空の配列を生成することができます。
var someInts = [Int]()
print("someInts is of type [Int] with \(someInts.count) items.")
// "someInts is of type [Int] with 0 items." と出力
変数 someInts
の型は、イニシャライザの型により [Int]
と推論されます。
関数の引数や、型が指定されている変数や定数のように、すでに型の情報がわかっている場合には、空の配列リテラル []
(角括弧一組)で空配列を生成することができます。
someInts.append(3)
// someInts には Int 型の値が 1 件
someInts = []
// someInts は空配列になったが、型は [Int] のまま
デフォルト値で配列を生成
Swift の Array
型は、指定したサイズで、値すべてが同じデフォルト値に設定される配列を生成するイニシャライザもあります。新しい配列に追加する項目数 (count
) と、適切な型のデフォルト値 (repeatedValue
) をこのイニシャライザに渡します。
var threeDoubles = [Double](count: 3, repeatedValue: 0.0)
// threeDoubles は [Double] 型で、[0.0, 0.0, 0.0]
2 つの配列を足し合わせて配列を生成
互換性のある型の配列を加算演算子 (+
) で足し合わせて、新たな配列を生成することができます。新たな配列の型は、足し合わせた配列の型から推論されます。
var anotherThreeDoubles = [Double](count: 3, repeatedValue: 2.5)
// anotherThreeDoubles は [Double] 型で、[2.5, 2.5, 2.5]
var sixDoubles = threeDoubles + anotherThreeDoubles
// sixDoubles is [Double] と推論され、[0.0, 0.0, 0.0, 2.5, 2.5, 2.5]
配列リテラルで配列を生成
1 つ以上の値を簡略的な方法で記述する配列リテラルでも、配列を初期化することができます。配列リテラルは、カンマで区切った値のリストを、角括弧で囲んで記述します。
[value 1, value 2, value 3]
次の例は、String
の値を格納する配列 shoppingList
を生成します。
var shoppingList: [String] = ["Eggs", "Milk"]
// shoppingList を 2 件の初期値で初期化
変数 shoppingList
は、[String]
と記述することで、「文字列値の配列」として宣言されています。この配列は String
型と指定しているため、String
値のみ格納することができます。配列 shoppingList
は、配列リテラルで記述された 2 つの String
値("Eggs"
と "Milk"
)で初期化されています。
shoppingList
は、以降の例で追加されるため、定数 (let
) ではなく、変数 (var
) で宣言されています。このケースでは、配列リテラルは 2 つの String
値を持ち、他の値はありません。変数 shoppingList
の宣言で指定されている型と一致しているため、この配列リテラルを代入して shoppingList
を初期化することができます。
Swift の型推論により、同じ型の値を持つ配列リテラルで初期化する場合には、配列の型を記述する必要はありません。shoppingList
の初期化を、より短い形式で記述することができます。
var shoppingList = ["Eggs", "Milk"]
配列リテラル内のすべての値が同じ型であるため、Swift は変数 shoppingList
の正しい型が [String]
であると推論することができます。
配列のアクセスおよび変更
配列のメソッドやプロパティ、あるいはサブスクリプトシンタックスを利用して、配列にアクセス、または配列を変更します。
配列内の件数は、読み取り専用の count
プロパティで確認します。
print("The shopping list contains \(shoppingList.count) items.")
// "The shopping list contains 2 items." と出力
count
プロパティが 0
かを確認する簡単な方法として、ブール値を返す isEmpty
プロパティを利用します。
if shoppingList.isEmpty {
print("The shopping list is empty.")
} else {
print("The shopping list is not empty.")
}
// "The shopping list is not empty." と出力
配列の append(_:)
メソッドを呼び出して、配列の末尾に新しい値を追加することができます。
shoppingList.append("Flour")
// shoppingList には値が 3 件あり、パンケーキを作ろうとしている
あるいは、加算代入演算子 (+=
) で配列が持つ 1 つ以上の値を追加します。
shoppingList += ["Baking Powder"]
// shoppingList には値が 4 件
shoppingList += ["Chocolate Spread", "Cheese", "Butter"]
// shoppingList には値が 7 件
取得したい値のインデックスを、角括弧で囲んで配列名の直後に置くサブスクリプトシンタックスを利用して、配列から値を取得します。
var firstItem = shoppingList[0]
// firstItem は "Eggs"
サブスクリプトシンタックスを利用して、指定したインデックスの値を変更することができます。
shoppingList[0] = "Six eggs"
// リストの最初の値は "Eggs" でなく "Six eggs"
値の範囲を一度に変更するためにサブスクリプトシンタックスを利用することができます。置き換える値の長さが異なる場合であっても置き換えることができます。次の例は、"Bananas"
と "Apples"
で、"Chocolate Spread"
と "Cheese"
、"Butter"
を置き換えています。
shoppingList[4...6] = ["Bananas", "Apples"]
// shoppingList には値が 6 件
配列の指定したインデックスに値を挿入するには、配列の insert(_:)
メソッドを呼び出します。
shoppingList.insert("Maple Syrup", atIndex: 0)
// shoppingList には値が 7 件
// "Maple Syrup" はリストの先頭
インデックス 0 で insert(_:atIndex:)
メソッドを呼び出して、リストの先頭に "Maple Syrup"
を挿入しています。
同様に、removeAtIndex(_:)
メソッドで配列から値を削除します。このメソッドは、指定したインデックスの値を取り除き、その値を返します(必要なければ、その戻り値を無視できます)。
let mapleSyrup = shoppingList.removeAtIndex(0)
// インデックス 0 の値を削除
// shoppingList には値が 6 件で、Maple Syrup は無い
// 定数 mapleSyrup は、削除された文字列 "Maple Syrup"
count
プロパティと比較して、インデックスが有効であるかを確認することができます。配列のインデックスはゼロからであるため、count
が 0
(配列が空)のときを除いて、有効なインデックスの最大値は常に count - 1
となります。値が削除されたときに配列の空きは埋められるため、インデックス 0 の値は再び "Six eggs"
になります。
firstItem = shoppingList[0]
// firstItem は "Six eggs"
配列から最後の値を削除したい場合には、配列の count
プロパティを必要とする removeAtIndex(_:)
メソッドよりも removeLast()
メソッドを利用します。removeAtIndex(_:)
メソッドと同じように、removeLast()
は削除された値を返します。
let apples = shoppingList.removeLast()
// 配列の最後の値を削除
// shoppingList には値が 5 件で、apples は無い
// 定数 apples は、削除された文字列 "Apples"
配列内を繰り返し処理
配列内のすべての値を、for
–in
ループで繰り返し処理することができます。
for item in shoppingList {
print(item)
}
// Six eggs
// Milk
// Flour
// Baking Powder
// Bananas
値だけでなく、各インデックスの整数値が必要な場合は、配列内を繰り返し処理する enumerate()
メソッドを代わりに使用します。enumerate()
メソッドは、配列内の各項目をインデックスと値で構成されるタプルで返します。繰り返し処理の一部として、タプルを一時的な定数に分解することができます。
for (index, value) in shoppingList.enumerate() {
print("Item \(index + 1): \(value)")
}
// Item 1: Six eggs
// Item 2: Milk
// Item 3: Flour
// Item 4: Baking Powder
// Item 5: Bananas
for
–in
ループについての詳細は、For-In Loops を確認してください。
Portions of this page are translations based on work created and shared by Apple and used according to terms described in the Creative Commons Attribution 4.0 International License.