MyClass
という名前のユーザ定義クラスのインスタンスは MyClass
型です。ユーザ定義の型に加えて、Swift 標準ライブラリは、配列、辞書、およびオプショナルの値を含む多くの広く使用される型の名前を定義します。(Int, (Int, Int))
には、名前付き型の Int
と複合型の (Int, Int)
の 2 つの要素が含まれています。()
)を付けることができます。ただし、型の周囲に括弧を必ずしも付ける必要はありません。例えば、(Int)
は Int
と同等です。GRAMMAR OF A TYPE type → function-type type → array-type type → dictionary-type type → type-identifier type → tuple-type type → optional-type type → implicitly-unwrapped-optional-type type → protocol-composition-type type → opaque-type type → metatype-type type → any-type type → self-type type →(
type)
:
)で始まり、型で終わります。(Double, Double)
を持つように指定されています。2 番目の例では、someFunction
関数の引数 a
が Int
型だと指定されています。Int
は、名前付き型 Int
を直接指す型識別子で、型識別子 Dictionary<String, Int>
は指定された Dictionary<String, Int>
を直接指します。Point
はタプル型 (Int, Int)
を指します。.
)構文を使用します。例えば、次のコードの型識別子は、ExamPleModule
モジュールで宣言されている名前付き型 MyType
を指しています。GRAMMAR OF A TYPE IDENTIFIER type-identifier → type-name generic-argument-clauseopt | type-name generic-argument-clauseopt.
type-identifier type-name → identifier
:
)の直前に識別子を指定します。これらの機能を示す例については、Functions with Multiple Return Values(複数の戻り値がある関数)を参照ください。()
のタイプエイリアスの Void
を除いて、2 つ以上の型が含まれています。GRAMMAR OF A TUPLE TYPE tuple-type →(
)
|(
tuple-type-element,
tuple-type-element-list)
tuple-type-element-list → tuple-type-element | tuple-type-element,
tuple-type-element-list tuple-type-element → element-name type-annotation | type element-name → identifier
->
)。,
)区切りのリストです。関数型は、_戻り値の型_がタプル型の可能性があるため、複数の値を返す関数とメソッドをサポートします。() -> T
(T
は任意の型)は、呼び出し側で暗黙的なクロージャを作成するために、autoclosure
を適用できます。これは、関数を呼び出すときに明示的にクロージャを書くことなく、式を遅延評価するための構文上の便利な方法です。autoclosure
の関数型のパラメータの例については、AutoClosures(自動クロージャ)を参照ください。Int...
のように要素の型名の後ろに 3 つのドット(...
)を記載し、要素の型の配列として扱われます。例えば、可変長パラメータ Int...
は [Int]
として扱われます。可変長パラメータを使用する例については、Variadic Parameters(可変長パラメータ)を参照ください。inout
キーワードをパラメータの型の前に付けます。可変長パラメータまたは戻り値の型にマークすることはできません。in-out パラメータは、In-Out Parameters(In-Out パラメータ)で説明されています。()
)で囲む必要があります。例えば、((Int, Int)) -> Void
は、タプル型 (Int, Int)
を単一のパラメータとして受け取り、値を返さない関数の型です。対照的に、括弧なしで (Int, Int) -> Void
と書いた場合は 2 つの Int
パラメータを受け取り、値を返さない関数型です。同様に、Void
は ()
のエイリアスのため、(Void)-> Void
は (()) -> ()
と同じで、空のタプルの単一の引数を受け取ります。() -> ()
は引数を受け取らないので同じではありません。->
)が含まれている場合、関数型は右から左にグループ化されます。例えば、関数型 (Int) -> (Int) -> Int
は、(Int) -> ((Int) -> Int)
で、Int
を受け取り、別の Int
を受け取り、Int
を返す関数を返します。throws
キーワードでマークする必要があります。throws
キーワードは関数型の一部で、_スローしない_関数はスロー関数のサブタイプです。その結果、スロー関数が使われる場所で、スローしない関数を使用できます。スロー関数や再スロー関数は、Throwing Functions and Methods(スロー関数とメソッド)、Rethrowing Functions and Methods(再スロー関数と再スローメソッド)で説明されています。Any
型のプロパティ、変数、または定数を格納することはできません。takesTwoFunctions(first:second:)
のパラメータは関数型です。どちらも @esescaping
がマークされていないため、非エスケープです。external
が takesTwoFunctions(first:second:)
のパラメータではないため、制限に違反しません。@esescaping
とマークしたり、パラメータの非エスケープ関数の 1 つを withoutActuallyEscaping(_:do:)
を使ってエスケープ関数に一時的に変換します。メモリへのアクセス競合を回避する方法については、Memory Safety(メモリ安全性)を参照ください。GRAMMAR OF A FUNCTION TYPE function-type → attributesopt function-type-argument-clausethrows
opt->
type function-type-argument-clause →(
)
function-type-argument-clause →(
function-type-argument-list...
opt)
function-type-argument-list → function-type-argument | function-type-argument,
function-type-argument-list function-type-argument → attributesoptinout
opt type | argument-label type-annotation argument-label → identifier
Array<Element>
の次の糖衣構文(シンタックスシュガー)を提供しています。SomeArray
は文字列の配列として宣言されています。角括弧([]
)内に有効範囲内のインデックスを指定することによって配列の要素にアクセスすることができます。someArray[0]
は、インデックス 0
の要素 "Alex"
を指します。subscript
のインデックスは、最も外側の配列内のインデックスの要素を指します。次に右の subscript
のインデックスは、1 階層ネストされている配列内のインデックスの要素になります。これは、上記の例では、array3D[0]
は [[1, 2], [3, 4]]
、array3D[0][1]
は [3,4]
、array3D[0][1][1]
は値 4
を表します。Dictionary<Key, Value>
型に次の糖衣構文(シンタックスシュガー)を提供しています。someDictionary
は、文字列をキー、整数をバリューとした辞書として宣言されています。[]
)でキーを指定して対応するバリューにアクセスすることができます。someDictionary["Alex"]
は、キー "Alex"
に関連するバリューを指します。subscript
は辞書の値型のオプショナル値を返します。指定されたキーが辞書に含まれていない場合、subscript
は nil
を返します。Hashable
に準拠している必要があります。Optional<Wrapped>
の糖衣構文(シンタックスシュガー)として、後置演算子 ?
を定義しています。つまり、次の 2 つの宣言は同等です:optionalInteger
はオプショナルの整数型を持つように宣言されています。型と ?
の間にスペースを入れないように注意してください。Optional<Wrapped>
型は、none
と some(Wrapped)
の 2 つのケースを持った列挙型です。任意の型で、オプショナルの型を明示的に(または暗黙的に変換するように)宣言することができます。オプショナルの変数またはプロパティを宣言するときに初期値を指定しない場合、その値は自動的に nil
になります。!
を使用してその値にアクセスできます:!
を使って nil
のオプショナルをアンラップしようとした場合、実行時エラーになります。nil
の場合、操作は実行されず、したがって実行時エラーが発生しません。Optional<Wrapped>
の後に !
を付けると、アクセス時に暗黙的にアンラップされる糖衣構文(シンタックスシュガー)を定義しています。nil
に暗黙アンラップオプショナルを使用しようとすると、実行時エラーが発生します。暗黙アンラップの動作以外は、次の 2 つの宣言は同等です:!
の間にスペースを入れないように注意してください。Optional<Wrapped>
型が使用できるコード内の全ての場所で使用できます。例えば、暗黙アンラップオプショナルの値をオプショナルの変数、定数、およびプロパティに割り当てることができます。nil
になります。nil
の場合、操作は実行されず、したがって実行時エラーが発生しません。where
句内に型を指定する場合にのみ使用できます。ProtocolA
と ProtocolB
と ProtocolC
を継承する新しいプロトコルを宣言する代わりに、プロトコル合成型の ProtocolA & ProtocolB & ProtocolC
を使用できます。同様に、SuperClass
のサブクラスと ProtocolA
に準拠した新しいプロトコルを宣言する代わりに SuperClass & ProtocolA
を使用することができ、ProtocolA
に準拠できます。PQR
の定義は、P&Q&R
と同じです。GRAMMAR OF A PROTOCOL COMPOSITION TYPE protocol-composition-type → type-identifier&
protocol-composition-continuation protocol-composition-continuation → type-identifier | protocol-composition-type
subscript
の戻り値の型、またはプロパティの型として使用できます。Opaque 型は、タプル型の一部や、配列の要素やオプショナルの Wrapped
の型などのジェネリックな型には使用できません。Any
型です。値としては、リスト内のプロトコルまたはプロトコル合成に準拠した型、またはリスト内のクラスを継承した型のインスタンスのみ使用できます。Opaque 型の値とやり取りするコードは、constraint に定義された型のインターフェイスを通してのみ使用できます。final
ではないメソッドの戻り値の型として Opaque 型を使用することはできません。someFunction<T>()
は T
型または Dictionary<String, T>
型の値を返すことができます。.Type
を書きます。(実行時のプロトコルに準拠した具体的な型ではない)プロトコル型の Metatype は、そのプロトコルの名前の後ろに .Protocol
を書きます。例えば、クラス型 SomeClass
の Metatype は SomeClass.Type
で、SomeProtocol
の Metatype は SomeProtocol.Protocol
です。self
式を使用します。例えば、SomeClass.self
は SomeClass
のインスタンスではなく、Someclass
自体を返します。そして、SomeProtocol.self
は、実行時に SomeProtocol
に準拠した型のインスタンスではなく、SomeProtocol
自体を返します。そのインスタンスの動的な実行時の型に値としてアクセスするには、次の例に示すように、type(of:)
関数を使用することができます:required
キーワードが付いたイニシャライザ、または final
のクラスでなければなりません。Any
は下記のいずれかの型の具体的なインスタンスの型として使用できます。Int.self
のような MetatypeAny
を使用する場合は、そのプロパティやメソッドにアクセスする前に、インスタンスを元の型にキャストする必要があります。Any
型のインスタンスは元の動的な型の情報を保持しており、型キャスト演算子(as
または as?
、または as!
)のいずれかを使用して元の型にキャストできます。例えば、異なる型の値を格納する配列内の最初のオブジェクトを条件付きでダウンキャストするには、次のようにします:AnyObject
プロトコルは Any
型と似ています。全てのクラスは暗黙的に AnyObject
に準拠しています。言語によって定義されているものとは異なり、AnyObject
は標準ライブラリで定義されています。詳細については、Class-Only Protocols(クラス専用プロトコル)と AnyObjectを参照ください。GRAMMAR OF AN ANY TYPE any-type →Any
Self
型は特定の型ではなく、その型の名前を繰り返したり明確にすることなく現在の型を都合よく参照できるようにします。Self
型は最終的にプロトコルに準拠した型を指します。Self
型は宣言している型を指します。型のメンバの宣言の内部では、Self
型はその型を表します。クラスのメンバの宣言の場合は、Self
は次に示すものにしか使用できません:subscript
の戻り値の型としてSelf
型のインスタンスメソッド f
を示しています:Self
は、コンパイル時のスーパークラスの型ではなく、z
の実行時のサブクラスの型を参照しています。Self
型は、最も内側の型を指します。Self
型は、標準ライブラリtype(of:)関数と同じ型を指します。現在の型のメンバにアクセスするめに Self.SomeStaticMember
を書くことは、type(of: self).someStaticMember
を書くのと同じです。GRAMMAR OF A SELF TYPE self-type →Self
:
)で始まり、その後に型識別子のリストが続きます。GRAMMAR OF A TYPE INHERITANCE CLAUSE type-inheritance-clause →:
type-inheritance-list type-inheritance-list → type-identifier | type-identifier,
type-inheritance-list
var x:Int = 0
と書く代わりに、var x = 0
と書くことができ、型を完全に省略すると、コンパイラが x
は Int
型だと推論します。同様に、完全に型をコンテキストから推論できる場合は、型の一部を省略することができます。例えば、let dict: Dictionary = ["A": 1]
と書いた場合、コンパイラは dict
が Dictionary<String, Int>
型だと推論します。var x:Int = 0
の x
の型は、最初に 0
の型を確認し、次にこの型情報をルート(変数 x
)まで渡すことによって推論されます。eFlat
は明示的な型注釈 (: Float)
によって、数値リテラル 2.71828
は Double
ではなく Float
型と推論されています。