Generic Structure

Array

An ordered, random-access collection. 順序付けられた、無作為アクセスのコレクション。

Declaration 宣言

@frozen struct Array<Element>

Overview 概要

Arrays are one of the most commonly used data types in an app. You use arrays to organize your app’s data. Specifically, you use the Array type to hold elements of a single type, the array’s Element type. An array can store any kind of elements—from integers to strings to classes. 配列は、アプリにおいて最も一般的に使われるデータ型の1つです。あなたは配列を使ってあなたのアプリのデータを整理します。とりわけ、あなたはArray型をある単一の型、その配列のもつElement型、の複数の要素を保持するために使います。ある配列は、整数から文字列まで、あるクラスであるどんなものであることもできます。

Swift makes it easy to create arrays in your code using an array literal: simply surround a comma-separated list of values with square brackets. Without any other information, Swift creates an array that includes the specified values, automatically inferring the array’s Element type. For example: Swiftはあなたのコードにおいて配列の作成を配列リテラルを使って簡単にします:単純にコンマ区切りの値のリストを角括弧で囲んでください。何らかの他の情報なしでは、Swiftは指定された値を含んでいる配列を、自動的にその配列のElement型を推論して作成します。例えば:


// An array of 'Int' elements
let oddNumbers = [1, 3, 5, 7, 9, 11, 13, 15]


// An array of 'String' elements
let streets = ["Albemarle", "Brandywine", "Chesapeake"]

You can create an empty array by specifying the Element type of your array in the declaration. For example: あなたは空の配列を、あなたの配列のElement型をその宣言において指定することで作成することができます。例えば:


// Shortened forms are preferred
var emptyDoubles: [Double] = []


// The full type name is also allowed
var emptyFloats: Array<Float> = Array()

If you need an array that is preinitialized with a fixed number of default values, use the Array(repeating:count:) initializer. あなたがある固定された数の省略時の値であらかじめ初期化される配列を必要とするならば、Array(repeating:count:)イニシャライザを使ってください。


var digitCounts = Array(repeating: 0, count: 10)
print(digitCounts)
// Prints "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]"

Accessing Array Values 配列の値にアクセスする

When you need to perform an operation on all of an array’s elements, use a for-in loop to iterate through the array’s contents. あなたがある配列の要素のすべてである演算を実行することを必要とするならば、for-inを使って配列の内容の始めから終わりまで反復適用してください。


for street in streets {
    print("I don't live on \(street).")
}
// Prints "I don't live on Albemarle."
// Prints "I don't live on Brandywine."
// Prints "I don't live on Chesapeake."

Use the isEmpty property to check quickly whether an array has any elements, or use the count property to find the number of elements in the array. isEmptyプロパティを使って、ある配列が要素を持つかどうか素早く確認してください、またはcountを使うことで配列中の要素の数を調べてください。


if oddNumbers.isEmpty {
    print("I don't know any odd numbers.")
} else {
    print("I know \(oddNumbers.count) odd numbers.")
}
// Prints "I know 8 odd numbers."

Use the first and last properties for safe access to the value of the array’s first and last elements. If the array is empty, these properties are nil. 配列の最初と最後の要素の値に対する安全なアクセスのためにfirstおよびlastプロパティを使ってください。その配列が空であるならば、これらのプロパティはnilです。


if let firstElement = oddNumbers.first, let lastElement = oddNumbers.last {
    print(firstElement, lastElement, separator: ", ")
}
// Prints "1, 15"


print(emptyDoubles.first, emptyDoubles.last, separator: ", ")
// Prints "nil, nil"

You can access individual array elements through a subscript. The first element of a nonempty array is always at index zero. You can subscript an array with any integer from zero up to, but not including, the count of the array. Using a negative number or an index equal to or greater than count triggers a runtime error. For example: あなたは個々の配列要素に添え字を通してアクセスすることができます。空でない配列の最初の要素は、常にインデックス0です。あなたは、ゼロから配列の総数まで、しかしそれを含めず、任意の整数で添え字を使うことができます。負数をまたはcountと等しいかより大きいインデックスを使うことは、実行時エラーを引き起こします。例えば:


print(oddNumbers[0], oddNumbers[3], separator: ", ")
// Prints "1, 7"


print(emptyDoubles[0])
// Triggers runtime error: Index out of range

Adding and Removing Elements 要素の追加と削除

Suppose you need to store a list of the names of students that are signed up for a class you’re teaching. During the registration period, you need to add and remove names as students add and drop the class. あなたが生徒の名前のリストをしまっておく必要があると仮定してみましょう、それはあなたが教えているクラスに受講届けを出されるものです。履修期間の間、あなたはそのクラスに生徒を加えたり落としたりするたびに名前を加えたり取り除いたりする必要があります。


var students = ["Ben", "Ivy", "Jordell"]

To add single elements to the end of an array, use the append(_:) method. Add multiple elements at the same time by passing another array or a sequence of any kind to the append(contentsOf:) method. 単一の要素を配列に加えるには、append(_:)メソッドを使ってください。append(contentsOf:)メソッドに別の配列や何らかの種類のシーケンスを渡すことによって、複数の要素を同時に加えてください。


students.append("Maxime")
students.append(contentsOf: ["Shakia", "William"])
// ["Ben", "Ivy", "Jordell", "Maxime", "Shakia", "William"]

You can add new elements in the middle of an array by using the insert(_:at:) method for single elements and by using insert(contentsOf:at:) to insert multiple elements from another collection or array literal. The elements at that index and later indices are shifted back to make room. あなたは、新しい要素を配列の中ほどに追加することが、単一の項目にはinsert(_:at:)メソッドを使って、そして別のコレクションや配列リテラルから複数の項目を挿入するにはinsert(contentsOf:at:)を使って行えます。そのインデックスおよび後のインデックスでの要素は、後ろに移って場所をあけます。


students.insert("Liam", at: 3)
// ["Ben", "Ivy", "Jordell", "Liam", "Maxime", "Shakia", "William"]

To remove elements from an array, use the remove(at:), removeSubrange(_:), and removeLast() methods. 配列から要素を取り除くには、remove(at:)removeSubrange(_:)、そしてremoveLast()メソッドを使ってください。


// Ben's family is moving to another state
students.remove(at: 0)
// ["Ivy", "Jordell", "Liam", "Maxime", "Shakia", "William"]


// William is signing up for a different class
students.removeLast()
// ["Ivy", "Jordell", "Liam", "Maxime", "Shakia"]

You can replace an existing element with a new value by assigning the new value to the subscript. あなたは、既存の要素を新しい値で置き換えることが、新しい値をその添え字に代入することで行えます。


if let i = students.firstIndex(of: "Maxime") {
    students[i] = "Max"
}
// ["Ivy", "Jordell", "Liam", "Max", "Shakia"]

Growing the Size of an Array 配列の大きさの増大

Every array reserves a specific amount of memory to hold its contents. When you add elements to an array and that array begins to exceed its reserved capacity, the array allocates a larger region of memory and copies its elements into the new storage. The new storage is a multiple of the old storage’s size. This exponential growth strategy means that appending an element happens in constant time, averaging the performance of many append operations. Append operations that trigger reallocation have a performance cost, but they occur less and less often as the array grows larger. すべての配列はある特定の量のメモリを確保することでその内容を保持します。あなたがいくらかの要素を配列に加えてその配列がそれの確保した容量を越え始める時、配列はより大きなメモリ領域を割り当てて、それの要素をその新しいストレージ(貯蔵場所)にコピーします。新しいストレージは古いストレージの大きさの倍数です。この指数成長戦略は、ある要素を加えることは、多くの追加操作の遂行を平均すると、定数時間に起こることを意味します。再割り当ての引き金となる追加操作はある性能コストを持ちます、しかしそれらは配列がより大きく成長するにつれて大抵ますます少ない頻度でしか生じません。

If you know approximately how many elements you will need to store, use the reserveCapacity(_:) method before appending to the array to avoid intermediate reallocations. Use the capacity and count properties to determine how many more elements the array can store without allocating larger storage. どのくらい多くの要素をあなたが格納する必要があるかをあなたがおおよそ知っているならば、配列に追加する前にreserveCapacity(_:)メソッドを使って中間的な再割り当てを回避するようにしてください。capacitycountプロパティを使って、より大きなストレージに割り当てることなく更にどのくらいの要素をその配列が格納できるか判定してください。

For arrays of most Element types, this storage is a contiguous block of memory. For arrays with an Element type that is a class or @objc protocol type, this storage can be a contiguous block of memory or an instance of NSArray. Because any arbitrary subclass of NSArray can become an Array, there are no guarantees about representation or efficiency in this case. ほとんどのElement型の配列に対して、このストレージは隣接メモリブロックです。クラスや@objcプロトコル型であるElement型を持つ配列に対して、このストレージは隣接メモリブロックまたはNSArrayのインスタンスであることができます。何であれ随意のNSArrayのサブクラスがArrayになることが可能であるので、表現や効率についてはこの場合保証されません。

Modifying Copies of Arrays 配列のコピーを修正する

Each array has an independent value that includes the values of all of its elements. For simple types such as integers and other structures, this means that when you change a value in one array, the value of that element does not change in any copies of the array. For example: 各配列はひとつの独立した値を持ち、それはそれのいくらかある要素の値すべてを含んでいます。例えば整数および他の構造体のような単純な型にとって、これは、あなたがある配列の中のある値を変更する場合、その要素の値はその配列の何らかのコピーにおいては変化しないことを意味します。例えば:


var numbers = [1, 2, 3, 4, 5]
var numbersCopy = numbers
numbers[0] = 100
print(numbers)
// Prints "[100, 2, 3, 4, 5]"
print(numbersCopy)
// Prints "[1, 2, 3, 4, 5]"

If the elements in an array are instances of a class, the semantics are the same, though they might appear different at first. In this case, the values stored in the array are references to objects that live outside the array. If you change a reference to an object in one array, only that array has a reference to the new object. However, if two arrays contain references to the same object, you can observe changes to that object’s properties from both arrays. For example: 配列に属する要素らがクラスのインスタンスらであるならば、意味論は同じです、にもかかわらずそれらは最初は異なっているように思うかもしれません。この場合、配列に格納される値らは、その配列の外側で生活しているオブジェクトらへの参照です。あなたがある配列におけるあるオブジェクトへの参照を変更するならば、単にその配列が新しいオブジェクトへの参照を持つだけです。しかしながら、2つの配列が同じオブジェクトへの参照を含むならば、あなたは両方の配列からそのオブジェクトの持つプロパティへの変更を観察するでしょう。例えば:


// An integer type with reference semantics
class IntegerReference {
    var value = 10
}
var firstIntegers = [IntegerReference(), IntegerReference()]
var secondIntegers = firstIntegers


// Modifications to an instance are visible from either array
firstIntegers[0].value = 100
print(secondIntegers[0].value)
// Prints "100"


// Replacements, additions, and removals are still visible
// only in the modified array
firstIntegers[0] = IntegerReference()
print(firstIntegers[0].value)
// Prints "10"
print(secondIntegers[0].value)
// Prints "100"

Arrays, like all variable-size collections in the standard library, use copy-on-write optimization. Multiple copies of an array share the same storage until you modify one of the copies. When that happens, the array being modified replaces its storage with a uniquely owned copy of itself, which is then modified in place. Optimizations are sometimes applied that can reduce the amount of copying. 配列は、標準ライブラリにおける可変サイズコレクションのすべてと同じく、コピーオンライト最適化を使います。ある配列の複数のコピーは、あなたがコピーの1つを修正するまでは、同じストレージを共有します。それが起こる場合、修正されている配列はそれのストレージを独自な自分だけの自身のコピーと置き換え、それはそれからそこで修正されます。最適化は時折適用されて、コピー回数を減らすことができます。

This means that if an array is sharing storage with other copies, the first mutating operation on that array incurs the cost of copying the array. An array that is the sole owner of its storage can perform mutating operations in place. これが意味するのは、ある配列がストレージを他のコピーと共有するならば、その配列上での最初の変更操作は、配列をコピーするコストを招くということです。それのストレージのただ一人のオーナーである配列は、変化を伴う操作をそこで実行することができます。

In the example below, a numbers array is created along with two copies that share the same storage. When the original numbers array is modified, it makes a unique copy of its storage before making the modification. Further modifications to numbers are made in place, while the two copies continue to share the original storage. 下の例において、numbers配列は2つのコピーと連れだって作成されます、それは同じストレージを共有します。オリジナルのnumbers配列が修正されるとき、それはそれのストレージの特有なコピーをその修正がなされる前に行います。numbersへの以降の修正は、そこでなされます、一方2つのコピーは元々のストレージの共有を続けます。


var numbers = [1, 2, 3, 4, 5]
var firstCopy = numbers
var secondCopy = numbers


// The storage for 'numbers' is copied here
numbers[0] = 100
numbers[1] = 200
numbers[2] = 300
// 'numbers' is [100, 200, 300, 4, 5]
// 'firstCopy' and 'secondCopy' are [1, 2, 3, 4, 5]

Bridging Between Array and NSArray ArrayとNSArrayの間のブリッジ

When you need to access APIs that require data in an NSArray instance instead of Array, use the type-cast operator (as) to bridge your instance. For bridging to be possible, the Element type of your array must be a class, an @objc protocol (a protocol imported from Objective-C or marked with the @objc attribute), or a type that bridges to a Foundation type. NSArrayインスタンスでのデータをArrayの代わりに期待するAPIにあなたがアクセスする必要がある場合、型キャスト演算子(as)を使ってあなたのインスタンスをブリッジしてください。ブリッジが可能にされるには、あなたの配列のElement型は、あるクラス、@objcプロトコル(Objective-Cからインポートされるまたは@objc属性で印されるプロトコル)、またはあるFoundation型にブリッジされる型でなければなりません。

The following example shows how you can bridge an Array instance to NSArray to use the write(to:atomically:) method. In this example, the colors array can be bridged to NSArray because the colors array’s String elements bridge to NSString. The compiler prevents bridging the moreColors array, on the other hand, because its Element type is Optional<String>, which does not bridge to a Foundation type. 以下の例は、どのようにあなたがArrayインスタンスをNSArrayへとブリッジして、write(to:atomically:)メソッドを使うかを示します。この例では、colors配列はNSArrayにブリッジできます、なぜならそれのcolors配列のもつString要素がNSStringにブリッジするからです。コンパイラは、moreColors配列をブリッジすることを妨げます、言い換えれば、それのElement型がOptional<String>であるので、それはFoundation型にブリッジしません


let colors = ["periwinkle", "rose", "moss"]
let moreColors: [String?] = ["ochre", "pine"]


let url = URL(fileURLWithPath: "names.plist")
(colors as NSArray).write(to: url, atomically: true)
// true


(moreColors as NSArray).write(to: url, atomically: true)
// error: cannot convert value of type '[String?]' to type 'NSArray'

Bridging from Array to NSArray takes O(1) time and O(1) space if the array’s elements are already instances of a class or an @objc protocol; otherwise, it takes O(n) time and space. ArrayからNSArrayへのブリッジは、配列のもつ要素がすでにあるクラスまたは@objcプロトコルのインスタンスであるならば、O(1)時間とO(1)空間をとります;そうでなければ、それはO(n)の時間と空間をとります。

When the destination array’s element type is a class or an @objc protocol, bridging from NSArray to Array first calls the copy(with:) (- copyWithZone: in Objective-C) method on the array to get an immutable copy and then performs additional Swift bookkeeping work that takes O(1) time. For instances of NSArray that are already immutable, copy(with:) usually returns the same array in O(1) time; otherwise, the copying performance is unspecified. If copy(with:) returns the same array, the instances of NSArray and Array share storage using the same copy-on-write optimization that is used when two instances of Array share storage. 行き先配列の持つ要素型があるクラスまたはある@objcプロトコルである場合、NSArrayからArrayへのブリッジはまずcopy(with:)(Objective-Cでの- copyWithZone:)メソッドをその配列上で呼び出すことである不変のコピーを取得します、そしてそれから追加のSwift簿記作業を実行します、それはO(1)時間をとります。元から不変であるNSArrayのインスタンスに対しては、copy(with:)は大抵は同じ配列をO(1)時間で返します;そうでなければ、コピーする性能は不定です。copy(with:)が同じ配列を返すならば、NSArrayArrayのインスタンスは同じコピーオンライト最適化を使ってストレージを共有します、それはArrayの2つのインスタンスがストレージを共有するとき使う最適化です。

When the destination array’s element type is a nonclass type that bridges to a Foundation type, bridging from NSArray to Array performs a bridging copy of the elements to contiguous storage in O(n) time. For example, bridging from NSArray to Array<Int> performs such a copy. No further bridging is required when accessing elements of the Array instance. 行き先配列の持つ要素型が非クラス型でFoundation型にブリッジする場合、NSArrayからArrayへのブリッジはそれら要素のコピーを隣接ストレージにブリッジすることをO(n)時間で実行します。例えば、NSArrayからArray<Int>へのブリッジは、そのようなコピーを実行します。さらなるブリッジはArrayインスタンスの要素にアクセスするとき全く必要とされません。

Topics 話題

Creating an Array 配列の作成

In addition to using an array literal, you can also create an array using these initializers. 配列リテラルを使うことに加えて、あなたはまた配列をこれらのイニシャライザを使って作成できます。

Inspecting an Array 配列を調査する

Accessing Elements 要素にアクセスする

Adding Elements 要素の追加

Combining Arrays 配列を結合する

Removing Elements 要素の削除

Finding Elements 要素を見つける

Selecting Elements 要素の選択

Excluding Elements 要素を除外する

Transforming an Array 配列の変形

Iterating Over an Array's Elements 配列の要素すべてに反復する

Reordering an Array's Elements 配列の要素を再配列します

Splitting and Joining Elements 要素の分割と連結

Creating and Applying Differences 差異の作成と適用

Comparing Arrays 配列の比較

Manipulating Indices インデックスを操る

Accessing Underlying Storage 基礎をなすストレージにアクセスする

Encoding and Decoding エンコーディングとデコーディング

Describing an Array 配列を記述する

Converting Between Arrays and Create ML Types 配列間で変換するそしてML型を作成する

Related Array Types 関連した配列型

Reference Types 参照型

Use bridged reference types when you need reference semantics or Foundation-specific behavior. ブリッジされた参照型を、あなたが参照意味論またはFoundation特有の挙動を必要とする場合に使ってください。

Supporting Types 支援を行う型

Infrequently Used Functionality 滅多に使われない機能性

Type Aliases 型エイリアス

Initializers イニシャライザ

Instance Properties 様々なインスタンスプロパティ

Instance Methods インスタンスメソッド

Relationships 関係

Conforms To 次に準拠

See Also 参照

Standard Library 標準ライブラリ