文書   >   Swift 標準ライブラリ   >   Initialization with Literals   >   ExpressibleByArrayLiteral
プロトコル
ExpressibleByArrayLiteral
配列リテラルを使用して初期化できる型。
宣言
概要
配列リテラルは、値のリストを表現する簡単な方法です。値、インスタンス、またはリテラルのカンマ区切りリストを角括弧で囲むだけで、配列リテラルが作成されます。ExpressibleByArrayLiteral 型のインスタンスが予想される任意の場所で配列リテラルを使用できます。変数または定数に代入された値として、メソッドまたはイニシャライザへのパラメータとして、または map(_:) または filter(_:) のような変更しない操作の対象としても使用できます。
配列、セット、およびオプションセットはすべて ExpressibleByArrayLiteral に準拠しており、独自のカスタム型も同様です。配列リテラルを使用してセットと配列を作成する例を次に示します。
let employeesSet: Set<String> = ["Amir", "Jihye", "Dave", "Alessia", "Dave"] print(employeesSet) // Prints "["Amir", "Dave", "Jihye", "Alessia"]" let employeesArray: [String] = ["Amir", "Jihye", "Dave", "Alessia", "Dave"] print(employeesArray) // Prints "["Amir", "Jihye", "Dave", "Alessia", "Dave"]"
Set 型と Array 型はそれぞれ、独自の方法で配列リテラルを処理して、新しいインスタンスを作成します。この場合、新しく作成されたセットは重複値 ("Dave") を削除し、配列リテラルの要素の順序を維持しません。一方、新しい配列は、提供された要素の順序と数に一致します。
配列リテラルは、Array インスタンスと同じではありません。既存の配列を割り当てるだけでは、ExpressibleByArrayLiteral に準拠する型を初期化することはできません。
let anotherSet: Set = employeesArray
// error: cannot convert value of type '[String]' to specified type 'Set'
配列リテラルの型推論
可能な場合はいつでも、Swift のコンパイラは、配列リテラルの完全に意図された型を推測します。Array は配列リテラルのデフォルトの型であるため、他のコードを記述することなく、1 つ以上の値を提供することにより、特定の要素型で配列を宣言できます。
この例では、コンパイラは各配列リテラルの完全な型を推測します。
let integers = [1, 2, 3] // 'integers' has type '[Int]' let strings = ["a", "b", "c"] // 'strings' has type '[String]'
空の配列リテラルだけでは、コンパイラが Array インスタンスの目的の型を推測するのに十分な情報を提供しません。空の配列リテラルを使用する場合、変数または定数の型を指定します。
var emptyArray: [Bool] = []
// 'emptyArray' has type '[Bool]'
多くの関数とイニシャライザはそのパラメータの型を完全に指定するため、多くの場合、パラメータとして要素の有無にかかわらず配列リテラルを使用できます。たとえば、次に示す sum(_:) 関数は、パラメータとして Int 配列を受け取ります。
func sum(values: [Int]) -> Int { return values.reduce(0, +) } let sumOfFour = sum([5, 10, 15, 20]) // 'sumOfFour' == 50 let sumOfNone = sum([]) // 'sumOfNone' == 0
そのパラメータの型を完全に指定していない関数を呼び出す場合、型キャスト演算子 (as) を使用して配列リテラルの型を指定します。たとえば、ここに示した log(name:value:) 関数には、制約のない汎用の value パラメータがあります。
func log<T>(name name: String, value: T) { print("\(name): \(value)") } log(name: "Four integers", value: [5, 10, 15, 20]) // Prints "Four integers: [5, 10, 15, 20]" log(name: "Zero integers", value: [] as [Int]) // Prints "Zero integers: []"
ExpressibleByArrayLiteral に準拠
init(arrayLiteral:) イニシャライザを宣言して、配列リテラルで初期化される機能を独自のカスタム型に追加します。以下の例は、架空の OrderedSet 型の配列リテラルイニシャライザを示し、これは set のような意味を持ちますが、その要素の順序を維持します。
struct OrderedSet<Element: Hashable>: Collection, SetAlgebra {
// implementation details
}
extension OrderedSet: ExpressibleByArrayLiteral {
init(arrayLiteral: Element...) {
self.init()
for element in arrayLiteral {
self.append(element)
}
}
}
トピックス
関連型
associatedtype ArrayLiteralElement
配列リテラルの要素の型。
必須。
イニシャライザ
init(arrayLiteral: Self.ArrayLiteralElement...)
与えられた要素で初期化されたインスタンスを作成します。
必須。デフォルトの実装が提供されます。
関連
以下により継承
SetAlgebra
SIMD
準拠する型
ArraySlice
ContiguousArray
IndexPath
MLDataValue.SequenceType
NSCountedSet
NSMutableArray
NSMutableOrderedSet
NSMutableSet
NSOrderedSet
NSSet
SBElementArray
以下も見よ
コレクション・リテラル
protocol ExpressibleByDictionaryLiteral
辞書リテラルを使用して初期化できる型。