Protocol

ExpressibleByArrayLiteral

A type that can be initialized using an array literal. 配列リテラルを使って初期化できる型。

Declaration 宣言

protocol ExpressibleByArrayLiteral

Overview 概要

An array literal is a simple way of expressing a list of values. Simply surround a comma-separated list of values, instances, or literals with square brackets to create an array literal. You can use an array literal anywhere an instance of an ExpressibleByArrayLiteral type is expected: as a value assigned to a variable or constant, as a parameter to a method or initializer, or even as the subject of a nonmutating operation like map(_:) or filter(_:). 配列リテラルは、値のリストを表す簡単な方法です。単にコンマ区切りの値、インスタンス、またはリテラルを角括弧で囲むことで、配列リテラルを作成してください。あなたは配列リテラルをExpressibleByArrayLiteral型が予期されるところはどこででも使うことができます:変数や定数に割り当てられる値として、メソッドやイニシャライザへのパラメータとして、またはmap(_:)filter(_:)のような非変更の操作のサブジェクトとしてさえも。

Arrays, sets, and option sets all conform to ExpressibleByArrayLiteral, and your own custom types can as well. Here’s an example of creating a set and an array using array literals: 配列、集合、またはオプションセットは、すべて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"]"

The Set and Array types each handle array literals in their own way to create new instances. In this case, the newly created set drops the duplicate value (“Dave”) and doesn’t maintain the order of the array literal’s elements. The new array, on the other hand, matches the order and number of elements provided. SetArray型は、それぞれ配列リテラルをそれら独自の方法で取り扱って、新しいインスタンスを作成します。この場合において、新たに作成された集合は、重複した値(「Dave」)を落とします、そして配列リテラルのもつ要素の順番を維持しません。一方、新しい配列は、提供された要素の順番と数に合致します。

Type Inference of Array Literals 配列リテラルの型推論

Whenever possible, Swift’s compiler infers the full intended type of your array literal. Because Array is the default type for an array literal, without writing any other code, you can declare an array with a particular element type by providing one or more values. 可能な時はいつでも、Swiftのコンパイラはあなたの配列リテラルの完全な意図される型を推論します。Arrayは配列リテラルのための省略時の型なので、なんら他のコードを書くことなく、あなたはひとつ以上の値を提供することによって特定の要素型を持つ配列を宣言できます。

In this example, the compiler infers the full type of each array literal. この例では、コンパイラは各配列の完全な型を推論します。


let integers = [1, 2, 3]
// 'integers' has type '[Int]'


let strings = ["a", "b", "c"]
// 'strings' has type '[String]'

An empty array literal alone doesn’t provide enough information for the compiler to infer the intended type of the Array instance. When using an empty array literal, specify the type of the variable or constant. 空の配列リテラルそれだけでは、コンパイラがArrayインスタンスの意図される型を推論するのに十分な情報を提供していません。空の配列リテラルを使う時は、変数または定数の型を指定してください。


var emptyArray: [Bool] = []
// 'emptyArray' has type '[Bool]'

Because many functions and initializers fully specify the types of their parameters, you can often use an array literal with or without elements as a parameter. For example, the sum(_:) function shown here takes an Int array as a parameter: 多くの関数とイニシャライザはそれらのパラメータの型を完全に指定することから、あなたはしばしば要素のあるまたはない配列リテラルをパラメータとして使うことができます。例えば、ここで示す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

When you call a function that does not fully specify its parameters’ types, use the type-cast operator (as) to specify the type of an array literal. For example, the log(name:value:) function shown here has an unconstrained generic value parameter. あなたが完全にそれのパラメータの型を指定しない関数を呼び出す場合は、型キャスト演算子(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: []"

Conforming to ExpressibleByArrayLiteral ExpressibleByArrayLiteralに準拠する

Add the capability to be initialized with an array literal to your own custom types by declaring an init(arrayLiteral:) initializer. The following example shows the array literal initializer for a hypothetical OrderedSet type, which has setlike semantics but maintains the order of its elements. init(arrayLiteral:)イニシャライザを宣言することによって、配列リテラルで初期化される能力をあなた独自のあつらえの型に加えてください。以下の例は、仮設的なOrderedSet型のための配列リテラルイニシャライザを示します、それは集合的な意味論を持つけれどもそれの要素の順番を維持します。


struct OrderedSet<Element: Hashable>: Collection, SetAlgebra {
    // implementation details
}


extension OrderedSet: ExpressibleByArrayLiteral {
    init(arrayLiteral: Element...) {
        self.init()
        for element in arrayLiteral {
            self.append(element)
        }
    }
}

Topics 話題

Associated Types さまざまな関連型

Initializers イニシャライザ

See Also 参照

Collection Literals コレクションリテラル