型キャスト


型キャスト(タイプキャスト) は、インスタンスの型をチェックし、または独自のクラス階層内の別の場所から別のスーパークラスまたはサブクラスとしてそのインスタンスを扱うための方法です。


Swift の型キャストは、isas 演算子として実装されています。これら2つの演算子は、値の型を確認するか、別の型に値をキャストするためのシンプルで表現豊かな方法を提供します。


また、プロトコル準拠の確認 で説明したように、型がプロトコルに準拠しているかどうかチェックするために型キャストを使用することもできます。



型キャストのためのクラス階層の定義


特定のクラスインスタンスの型をチェックし、同じ階層内の別のクラスにそのインスタンスをキャストするクラスとサブクラスの階層で型キャストを使用できます。以下の3つのコードスニペットは、クラスの階層と型キャストの例で使用するためのそれらのクラスのインスタンスを含む配列を定義します。


最初のスニペットは MediaItem という新しい基本クラスを定義します。このクラスは、デジタルメディアライブラリに表示された項目の全ての種類の基本的な機能を提供しています。具体的には、String 型の name プロパティと init name イニシャライザを宣言しています。(これは、すべての映画や曲を含むすべてのメディア項目は、名前を持っていると想定しています。)


  1. class MediaItem {
  2.         var name: String
  3.         init(name: String) {
  4.                 self.name = name
  5.         }
  6. }


次のスニペットは MediaItem の2つのサブクラスを定義しています。最初のサブクラス、Movie は、映画やフィルムに関する追加情報をカプセル化します。対応するイニシャライザで、基本の MediaItem クラスの最上部に director プロパティを追加します。第二のサブクラス、Song は、基底クラスの最上部に、artist プロパティとイニシャライザを追加します。


  1. class Movie: MediaItem {
  2.         var director: String
  3.         init(name: String, director: String) {
  4.                 self.director = director
  5.                 super.init(name: name)
  6.         }
  7. }
  8. class Song: MediaItem {
  9.         var artist: String
  10.         init(name: String, artist: String) {
  11.                 self.artist = artist
  12.                 super.init(name: name)
  13.         }
  14. }


最後のスニペットは、2つの Movie インスタンスと3つの Song インスタンスを含む library と言う定数の配列を作成します。library 配列の型は、配列リテラルの内容でそれを初期化することにより推測されます。Swift の型チェッカーはその MovieSongMediaItem の共通のスーパークラスを持っている事を推測することができ、それが library 配列の [MediaItem] 型を推測します:


  1. let library = [
  2.         Movie(name: "Casablanca", director: "Michael Curtiz"),
  3.         Song(name: "Blue Suede Shoes", artist: "Elvis Presley"),
  4.         Movie(name: "Citizen Kane", director: "Orson Welles"),
  5.         Song(name: "The One And Only", artist: "Chesney Hawkes"),
  6.         Song(name: "Never Gonna Give You Up", artist: "Rick Astley")
  7. ]
  8. // the type of "library" is inferred to be [MediaItem]


library に格納されている項目は、舞台裏ではまだ MovieSong インスタンスです。しかし、この配列の内容を繰り返し処理した場合、受け取る項目は MediaItem としての型であり、MovieSong としてではありません。それらの特有の型としてそれらと仕事をするには、下記のように、それらの型を チェック して、または別の型にそれらを ダウンキャスト する必要があります。



型のチェック


インスタンスが特定のサブクラスの型であるかどうかをチェックするためには 型チェック演算子 (is) を使用して下さい。インスタンスがそのサブクラスの型であれば、型チェック演算子は true を返し、そうでない場合、false を返します。


以下の例では、library 配列内の MovieSong のインスタンスの数を数える2つの変数、movieCountsongCount を定義しています。


  1. var movieCount = 0
  2. var songCount = 0
  3. for item in library {
  4.         if item is Movie {
  5.                 movieCount += 1
  6.         } else if item is Song {
  7.                 songCount += 1
  8.         }
  9. }
  10. print("Media library contains \(movieCount) movies and \(songCount) songs")
  11. // prints "Media library contains 2 movies and 3 songs"


この例は、library 配列内のすべての項目を反復処理します。各パスで、for-in ループは配列内の次の MediaItemitem 定数を設定します。


item is Movie は、現在の MediaItemMovie インスタンスの場合 true を返し、そうでない場合、false を返します。同様に、item is Song は項目が Song インスタンスであるかどうかをチェックします。for-in ループの終わりに、movieCountsongCount の値は、各型の MediaItem インスタンスがどれだけ多く発見されたかの数を含んでいます。



ダウンキャスト


特定のクラスの型の定数または変数は、実際には舞台裏ではサブクラスのインスタンスを参照しているかもしれません。このような事だと考えている場合、型キャスト演算子 (as? または as!) でサブクラス型に ダウンキャスト しようとすることができます。


ダウンキャストは失敗することがあるので、型キャスト演算子は、二つの異なる形式で提供されます。条件付きの形式は、as? で、ダウンキャストしようとしている型の optional の値を返します。強制的な形は、as! で、ダウンキャストを試み、単一の複合アクションとして結果を強制開封します。


ダウンキャストが失敗する可能性があるため、型キャスト演算子は 2 つの異なる形式で提供されます。条件付き形式は、as? で、ダウンキャストしようとしている型の optional の値を返します。矯正形式 as! は、ダウンキャストを試み、結果を単一の複合アクションとして強制開封します。


ダウンキャストが成功するかどうかわからない時には、型キャスト演算子 (as?) の条件付き形式を使用して下さい。演算子のこの形式は、常に optional の値を返し、ダウンキャストが不可能であった場合、値は nil になります。これで、ダウンキャストが成功したかどうかをチェックできます。


ダウンキャストが常に成功すると確信している場合にのみ、型キャスト演算子の強制的な形式 (as!) を使用して下さい。間違ったクラス型へダウンキャストしようとした場合、演算子のこの形式は、実行時エラーを引き起こします。


以下の例では、library 内の各 MediaItem を反復処理し、各項目の適切な説明を出力します。これを行うには、単に MediaItem としてではなく、真の MovieSong として各項目にアクセスする必要があります。その説明で使用するための MovieSongdirectorartist プロパティにアクセスできるようにするためにこれは必要です。


この例では、配列内の各項目は、Movie である場合もあれば、Song である場合もあります。各項目に使用する、実際のクラスは、事前にはわからないので、ループを通じて毎回ダウンキャストをチェックするには、型キャスト演算子(as?) の条件付きの形を使用することが適切です:


  1. for item in library {
  2.         if let movie = item as? Movie {
  3.                 print("Movie: '\(movie.name)', dir. \(movie.director)")
  4.         } else if let song = item as? Song {
  5.                 print("Song: '\(song.name)', by \(song.artist)")
  6.         }
  7. }
  8. // Movie: 'Casablanca', dir. Michael Curtiz
  9. // Song: 'Blue Suede Shoes', by Elvis Presley
  10. // Movie: 'Citizen Kane', dir. Orson Welles
  11. // Song: 'The One And Only', by Chesney Hawkes
  12. // Song: 'Never Gonna Give You Up', by Rick Astley


この例では、Movie として現在の item をダウンキャストしようとして始まります。itemMediaItem インスタンスなので、それが Movie かも しれません。同じように、それはまた Song かもしれませんし、あるいは基本の MediaItem かもしれません。この不確実性のため、as? 形式の型キャスト演算子は、サブクラス型にダウンキャストしようとすると optional の値を返します。item as? Movie の結果は、Movie? 型か、または "optional の Movie" です。


library 配列内の Song インスタンスに適用された場合に Movie にダウンキャストする事は失敗します。これに対処するため、上記の例では、optional の Movie が、実際に値 (つまり、ダウンキャストが成功したかどうかを調べる) があるか確認するために、optional 結合を使います。optional の結合は "if let movie = item as? Movie" と書かれており、こう読めます:


"Movie として item にアクセスしてみました。これが成功すれば、戻された optional の Movie に格納されている値に movie と言う新しい一時的な定数を設定します。" と。


ダウンキャストが成功すると、movie のプロパティは、その director の名前を含め、その Movie インスタンスの説明を印刷するために使用されます。同様の原理は、Song> インスタンスをチェックするためと、そして Song が library で発見されるたびに (artist 名を含む) 適切な説明を印刷するために使用されます。



注意: キャストは実際にはインスタンスを変更したり、その値を変更しません。基本となるインスタンスは同じままで、単純に処理され、型のインスタンスは、それがキャストされた型としてアクセスされます。


Any と AnyObject 用の型キャスティング


Swift は、非特定の型を操作するための二つの特別な型を提供します。


明示的にそれらが提供する動作や能力を必要な場合にのみ、AnyAnyObject を使用してください。コード内で動作するように期待する型について特別であるのが常により良い事です。


ここで関数型と非クラス型を含む、異なる型の混合で動作するように Any を使用する例を挙げます。この例では、Any 型の値を格納できる things と言う配列を作成します。


  1. var things = [Any]()
  2. things.append(0)
  3. things.append(0.0)
  4. things.append(42)
  5. things.append(3.14159)
  6. things.append("hello")
  7. things.append((3.0, 5.0))
  8. things.append(Movie(name: "Ghostbusters", director: "Ivan Reitman"))
  9. things.append({ (name: String) -> String in "Hello, \(name)" })


things 配列は、2つの Int 値、2つの Double 値、一つの String 値、(Double,Double) 型のタプル、映画"ゴーストバスターズ"、および String 値を取り、別の String 値を返すクロージャ式を含んでいます。


Any または AnyObject 型のいずれかでしかないと知られている定数または変数の特定の型を発見するようにするには、switch 文の case の isas パターンを使う事ができます。以下の例は、things 配列内の項目を繰り返し処理し、switch 文で各項目の型を照会します。switch 文の case のいくつかは、その値を印刷するのを有効にするには、指定された型の定数に、その一致した値を結合します:


  1. for thing in things {
  2.         switch thing {
  3.         case 0 as Int:
  4.                 print("zero as an Int")
  5.         case 0 as Double:
  6.                 print("zero as a Double")
  7.         case let someInt as Int:
  8.                 print("an integer value of \(someInt)")
  9.         case let someDouble as Double where someDouble > 0:
  10.                 print("a positive double value of \(someDouble)")
  11.         case is Double:
  12.                 print("some other double value that I don't want to print")
  13.         case let someString as String:
  14.                 print("a string value of \"\(someString)\"")
  15.         case let (x, y) as (Double, Double):
  16.                 print("an (x, y) point at \(x), \(y)")
  17.         case let movie as Movie:
  18.                 print("a movie called '\(movie.name)', dir. \(movie.director)")
  19.         case let stringConverter as (String) -> String:
  20.                 print(stringConverter("Michael"))
  21.         default:
  22.                 print("something else")
  23.         }
  24. }
  25. // zero as an Int
  26. // zero as a Double
  27. // an integer value of 42
  28. // a positive double value of 3.14159
  29. // a string value of "hello"
  30. // an (x, y) point at 3.0, 5.0
  31. // a movie called 'Ghostbusters', dir. Ivan Reitman
  32. // Hello, Michael


注意: Any 型は、optional 型を含む任意の型の値を表します。Swift は、Any 型の値が期待される所で optional の値を使用すると、警告を表示します。optional 値を Any 値として使用する必要が実際にある場合は、as 演算子を使用して、以下に示すように Any に optional を明示的にキャストできます。

  1. let optionalNumber: Int? = 3
  2. things.append(optionalNumber)                 // Warning
  3. things.append(optionalNumber as Any) // No warning





前:エラー処理 次:ネストした型
目次
Xcode 10 の新機能

Swift:はじめに
Swift と Cocoa と Objective-C
Swift Blog より

  • ようこそ Swift へ(Part I)
  • Swift について
  • バージョン互換性
  • Swift のツアー
  • 単純な値
    制御フロー
    関数とクロージャ
    オブジェクトとクラス
    列挙型と構造体
    プロトコルと拡張機能
    エラー処理
    汎用(ジェネリック)
  • Swift 言語のガイド(Part II)
  • Swift の基本
  • 定数と変数
  • 定数と変数の宣言
    型注釈
    定数と変数の命名
    定数と変数の印刷
    コメント
    セミコロン
  • 整数
  • 整数の境界
    Int
    UInt
    浮動小数点数
    安全な型と型推論
    数値リテラル
  • 数値型変換
  • 整数変換
    整数と浮動小数点間の変換
    型エイリアス
    ブール型
    タプル
  • Optional
  • nil
    if 文と強制開封
    Optional の結合
    暗黙に開封された Optionals
    エラー処理
  • アサーション(断言)と前提条件
  • アサーションを使用したデバッグ
    前提条件の実施
  • 基本演算子
  • 専門用語
    代入演算子
  • 算術演算子
  • 剰余演算子
    単項マイナス演算子
    単項プラス演算子
    複合代入演算子
    比較演算子
    三項条件演算子
    Nil 合体演算子
  • 範囲演算子
  • 閉鎖範囲演算子
    半開放範囲演算子
    片方の範囲
  • 論理演算子
  • 論理 NOT 演算子
    論理 AND 演算子
    論理 OR 演算子
    論理演算子の組み合わせ
    明示的な括弧
  • 文字列と文字
  • 文字列リテラル
    複数行の文字列リテラル
    文字列リテラル内の特殊文字
    空の文字列の初期化
    文字列の可変性
    文字列は値の型
    文字を使った作業
    文字列と文字を連結
    文字列補間
  • ユニコード(Unicode)
  • Unicode スカラー
    文字列リテラルの中の特別の文字
    拡張書記クラスタ
    文字を数える
  • 文字列のアクセスと変更
  • 文字列のインデックス
    部分文字列
    挿入と削除
  • 文字列の比較
  • 文字列と文字の等価性
    接頭辞と接尾辞の等価性
  • 文字列の Unicode 表現
  • UTF-8 の表現
    UTF-16 表現
    Unicode のスカラー表現
  • コレクション型
  • コレクションの可変性
  • 配列
  • 配列型省略構文
    空の配列の作成
    デフォルト値を持つ配列の作成
    2つの配列を共にして一つの配列に
    配列リテラルでの配列の作成
    配列へのアクセスと変更
    配列の繰り返し処理
  • セット
  • セット型のハッシュ値
    セット型の構文
    空のセットの作成と初期化
    配列リテラルでセットの作成
    セットへのアクセスと変更
    セットを反復処理
  • セット操作の実行
  • 基本的なセットの操作
    セットの身分と等価性
  • Dictionary
  • Dictionary 型の省略型構文
    空の Dictionary を作成
    Dictionary リテラルで Dictionary の作成
    Dictionary のアクセスと変更
    Dictionary を繰り返し処理
  • フロー制御
  • For-In ループ
  • While ループ
  • While
    Repeat-While
  • 条件文
  • if 文
  • Switch
  • 暗黙の Fallthrough なし
    範囲の一致
    タプル(Tuples)
    値の結合
    Where
    複合した case
  • 制御転送文
  • Continue
  • Break
  • ループ文内の Break
    Switch 文内の Break
    Fallthrough
    ラベル付きの文
    早期終了
    API 利用可能性の確認
  • 関数
  • 関数の定義と呼び出し
  • 関数のパラメータと戻り値
  • パラメータなしの関数
    複数パラメータの関数
    戻り値なしの関数
    複数の戻り値を持つ関数
    optional のタプル型の戻り値
  • 関数引数のラベルとパラメータ名
  • 引数のラベルの指定
    引数ラベルの省略
    デフォルトのパラメータ値
    可変個引数のパラメータ
    In-Out パラメータ
  • 関数型
  • 関数型の使用
    パラメータ型としての関数型
    戻り値の型としての関数型
    入れ子になった関数
  • クロージャ
  • クロージャ式
  • ソートするメソッド
    クロージャ式の構文
    文脈から型を推論
    単一式クロージャからの暗黙的戻り値
    引数名の省略
    演算子メソッド
    後続クロージャ
    値のキャプチャ
    クロージャは参照型
    クロージャのエスケープ
    オートクロージャ
  • 列挙型
  • 列挙型の構文
    switch 文で列挙型の値の一致
    関連する値
  • 生の値
  • 暗黙に割り当てられた生の値
    生の値からの初期化
    再帰的な列挙型
  • クラスと構造体
  • クラスと構造体を比較
  • 定義の構文
    クラスと構造体のインスタンス
    プロパティにアクセス
    構造体型のためのメンバー化イニシャライザ
    構造体と列挙型は値型
  • クラスは参照型
  • ID 演算子
    ポインタ
    クラスと構造体の間の選択
    文字列、配列、辞書の代入とコピーの動作
  • プロパティ
  • 格納されたプロパティ
  • 定数構造体インスタンスの格納されたプロパティ
    遅延した格納されたプロパティ
    格納されたプロパティとインスタンス変数
  • 計算されたプロパティ
  • セッタ宣言の省略形
    読み取り専用の計算されたプロパティ
    プロパティ監視者
    グローバルとローカル変数
  • 型プロパティ
  • 型プロパティの構文
    型プロパティの照会と設定
  • メソッド
  • インスタンスメソッド
  • self プロパティ
    インスタンスメソッド内から値の型を変更
    変異メソッド内で self に代入
    型メソッド
  • サブスクリプト
  • サブスクリプトの構文
    サブスクリプトの使用法
    サブスクリプトのオプション
  • 継承
  • 基本クラスの定義
    サブクラス化
  • オーバーライド(上書き)
  • スーパークラスメソッド、プロパティ、サブスクリプトへのアクセス
    オーバーライドするメソッド
  • オーバーライドするプロパティ
  • プロパティのゲッタとセッタのオーバーライド
    プロパティ監視者のオーバーライド
    オーバーライドの防止
  • 初期化
  • 格納されたプロパティの初期値を設定
  • イニシャライザ
    デフォルトのプロパティ値
  • 初期化のカスタマイズ
  • 初期化パラメータ
    パラメータ名と引数ラベル
    引数ラベルのないイニシャライザのパラメータ
    Optional のプロパティ型
    初期化中に定数プロパティへの代入
  • デフォルトのイニシャライザ
  • 構造体型のためのメンバ化イニシャライザ
    値型のイニシャライザデリゲート
  • クラスの継承と初期化
  • 指定イニシャライザとコンビニエンスイニシャライザ
    指定とコンビニエンスイニシャライザの構文
    クラス型のイニシャライザデリゲート
    二相の初期化
    イニシャライザ継承とオーバーライド
    自動イニシャライザの継承
    実際の指定とコンビニエンスイニシャライザ
  • 失敗可能イニシャライザ
  • 生の値を持つ列挙型のための失敗可能イニシャライザ
    初期化失敗の伝播
    失敗可能イニシャライザのオーバーライド
    init! の失敗可能イニシャライザ
    必須イニシャライザ
    クロージャや関数でのデフォルトのプロパティ値設定
  • デイニシャライザ
  • デイニシャライザはどのように働くか
    作動中のデイニシャライザ
  • Optional の連鎖
  • 強制開封の代替としての Optional の連鎖
    Optional の連鎖のモデルクラスの定義
    Optional の連鎖を使用したプロパティへのアクセス
    Optional の連鎖を通じてメソッドを呼び出す
  • Optional の連鎖を通じてサブスクリプトへのアクセス
  • Optional 型のサブスクリプトにアクセス
    連鎖の複数レベルのリンク
    optional の戻り値を持つメソッドでの連鎖
  • エラー処理
  • エラーの表現と Throw
    エラーの処理
    throw 関数を使用したエラーの伝播
    Do-Catch を使用したエラー処理
    エラー をOptional の値に変換
    エラー伝播を無効に
    クリーンアップアクションの指定
  • 型キャスト
  • 型キャストのためのクラス階層の定義
    型のチェック
    ダウンキャスト
  • Any と AnyObjecgt 用の型キャスティング
  • ネストした型
  • 実際のネストした型
    ネストした型への参照
  • 拡張機能
  • 拡張機能の構文
    計算されたプロパティ
    イニシャライザ
  • メソッド
  • 変異インスタンスメソッド
    サブスクリプト
    ネストした型
  • プロトコル
  • プロトコルの構文
    プロパティの要件
    メソッドの要件
    変異メソッドの要件
  • イニシャライザの要件
  • プロトコルイニシャライザ要件のクラス実装
    失敗可能イニシャライザの要件
    型としてのプロトコル
    デリゲート
  • 拡張機能を持つプロトコル準拠の追加
  • 拡張機能を持つプロトコルの採用を宣言
    プロトコル型のコレクション
    プロトコルの継承
    クラス専用プロトコル
    プロトコルの構成
    プロトコル準拠の確認
    Optional のプロトコル要件
  • プロトコル拡張機能
  • デフォルトの実装の提供
    プロトコル拡張機能に制約を追加
  • ジェネリック(汎用)
  • 汎用が解決する問題
    汎用関数
    型パラメータ
    型パラメータの命名
    汎用の型
    汎用型の拡張
  • 型の制約
  • 型制約の構文
    実際の型の制約
  • 関連型
  • 実際の関連型
    既存の型を拡張して関連型を指定
    型注釈を使用して関連型を制約
    汎用の Where 句
    汎用の Where 句を含む拡張機能
    関連する型と汎用の Where 句
    汎用のサブスクリプト
  • 自動参照カウント
  • どのように ARC は働くか
    実際の ARC
    クラスインスタンス間の強い循環参照
  • クラスインスタンス間の強い循環参照の解決
  • 弱い参照
    所有されていない参照
    所有されていない参照と暗黙に開封された Optional のプロパティ
    クロージャの strong な循環参照
  • クロージャの strong な循環参照の解決
  • キャプチャリストの定義
    弱い参照と所有されていない参照
  • メモリの安全性
  • メモリへのアクセス競合の理解
    メモリアクセスの特徴
    In-Out パラメータへのアクセスの競合
    メソッド内の Self へのアクセスの競合
    プロパティへのアクセスの競合
  • アクセス制御
  • モジュールとソースファイル
  • アクセスレベル
  • アクセスレベルの全体的指針
    デフォルトのアクセスレベル
    ターゲット一つのアプリのアクセスレベル
    フレームワークのアクセスレベル
    ユニットテストのターゲット用のアクセスレベル
    アクセス制御の構文
  • カスタム型
  • タプル型
    関数型
  • 列挙型
  • 生の値と関連する値
    ネストした型
    サブクラス化
  • 定数、変数、プロパティ、およびサブスクリプト
  • ゲッタとセッタ
  • イニシャライザ
  • デフォルトのイニシャライザ
    構造体型用のデフォルトメンバ化イニシャライザ
  • プロトコル
  • プロトコルの継承
    プロトコルの準拠
  • 拡張機能
  • 拡張機能の private メンバ
    汎用
    型エイリアス
  • 高度な演算子
  • ビット単位演算子
  • ビット単位の NOT 演算子
    ビット単位の AND 演算子
    ビット単位の OR 演算子
    ビット単位の XOR 演算子
  • ビット単位の左と右シフト演算子
  • 符号なし整数のシフト動作
    符号付き整数のシフト動作
  • オーバーフロー演算子
  • 値オーバーフロー
    優先順位と結合性
  • 演算子メソッド
  • 接頭辞と接尾辞演算子
    複合代入演算子
    等価演算子
  • カスタム演算子
  • カスタム挿入辞演算子の優先順位
  • 言語のガイド(Part III)
  • 言語リファレンスについて
  • 文法の読み方
  • 語彙の構造
  • 空白とコメント
    識別子
    キーワードと句読点
  • リテラル
  • 整数リテラル
    浮動小数点リテラル
    文字列のリテラル
    演算子

  • 型注釈
    型識別子
    タプル型
    関数型
    エスケープしないクロージャの制限事項
    配列型
    辞書型
    Optional の型
    暗黙に開封された Optional の型
    プロトコル構成の型
    メタタイプ型
    型の継承句
    型の推測

  • 接頭辞式
    Try 演算子
  • 二項式
  • 代入演算子
    三項条件演算子
    型キャスト演算子
  • 一次式
  • リテラル式
    Self 式
    スーパークラス式
  • クロージャ式
  • キャプチャ・リスト
    暗黙のメンバ式
    括弧で囲まれた式
    タプル式
    ワイルドカード式
    キーパス式
    セレクタ式
    キーパス文字列式
  • 接尾辞の式
  • 関数呼び出し式
    イニシャライザ式
    明示的なメンバ式
    接尾辞の Self 式
    サブスクリプト 式
    強制値の式
    Optional の連鎖式

  • ループ文
  • For-In 文
    While 文
    Repeat-While 文
  • 分岐文
  • if 文
    Guard 文
  • switch 文
  • switch 文は、網羅的である必要あり
    実行が暗黙的に case を Fall Through しない
    ラベル付き文
  • 制御転送文
  • break 文
    continue 文
    fallthrough 文
    return 文
    throw 文
    defer 文
    do 文
  • コンパイラ制御文
  • 条件コンパイルブロック
    行制御文
    利用可能条件
  • 宣言
  • トップレベルのコード
    コードブロック
    Import 宣言
    ­定数の宣言
  • 変数の宣言
  • 格納された変数と格納された変数のプロパティ
    計算された変数と計算されたプロパティ
    格納された変数監視者とプロパティの監視者
    型変数プロパティ
    型エイリアス宣言
  • 関数の宣言
  • パラメータ名
    In-Out パラメータ
    パラメータの特殊な種類
    メソッドの特殊な種類
    Throw する関数とメソッド
    Rethrow する関数とメソッド
    決して返さない関数
  • 列挙型の宣言
  • 任意の型の case を列挙
  • 間接による列挙
    生の値型の case を列挙
    列挙型 case へのアクセス
    構造体の宣言
    クラスの宣言
  • プロトコルの宣言
  • プロトコル・プロパティ宣言
    プロトコル・メソッド宣言
    プロトコル・イニシャライザ宣言
    プロトコル・サブスクリプト宣言
    プロトコルに関連した型の宣言
  • イニシャライザ宣言
  • 失敗可能イニシャライザ
    デイニシャライザ宣言
    拡張機能の宣言
    サブスクリプト宣言
    演算子の宣言
    優先順位グループ宣言
  • 宣言修飾子
  • アクセス制御レベル
  • 属性
  • 宣言の属性
  • インターフェイスビルダーで使われる宣言属性
    型の属性
  • パターン
  • ワイルドカードパターン
    識別子パターン
    値結合パターン
    タプルパターン
    列挙型 case パターン
    Optional のパターン
    型キャストパターン
    式のパターン
  • 汎用パラメータと引数
  • 汎用パラメータ句
  • 汎用の where 句
    汎用引数句
  • 文法のまとめ
  • 語彙の構造



    宣言
    属性
    パターン
    汎用パラメータと引数
  • マニュアルの変更履歴
  • 変更履歴