エラー処理


エラー処理 は、プログラム内でのエラー状態にに応答し、回復するプロセスです。Swift は、throw、catch、propagate、および実行時での回復可能なエラーを操作するための第一級のサポートを提供しています。


一部の操作は、常に完全な実行、または有用な出力を生成する事をを保証しません。Optionals は値が存在しないことを表すために使用されますが、操作が失敗したときに、あなたのコードがそれに従って応答できるように、失敗の原因を理解するのにそれは便利です。


例としては、ディスク上のファイルからのデータの読み込みと処理のタスクを考えてみて下さい。ファイルが指定されたパスに存在しない、ファイルが読み取り権限を持っていない、またはファイルが互換性のある形式でコード化されていない事を含めて、このタスクが失敗する多くの場合があります。これらのさまざまな状況を区別するには、いくつかのエラーを解決するために、ユーザーにプログラムが解決できないすべてのエラーを通信できます。


注意: Swift でのエラー処理は、Cocoa と Objective-C での NSError クラスを使用したエラー処理パターンと相互運用できます。このクラスの詳細については、Cocoa と Objective-C(Swift 3)のスウィフトの使い方エラー処理 を参照してください。


エラーの表現と Throw


Swift では、エラーは、Error プロトコルに準拠する型の値によって表されます。この空のプロトコルは、型がエラー処理のために使用できることを示しています。


Swift の列挙型は、通信されるエラーの性質に関する追加情報を可能にする、関連する値と関連するエラー条件のグループを、モデル化するのに特に適しています。たとえば、ゲーム内の自動販売機を操作するのにエラー状態を表す方法は以下のとおりです。


  1. enum VendingMachineError: Error {
  2.         case invalidSelection
  3.         case insufficientFunds(coinsNeeded: Int)
  4.         case outOfStock
  5. }


エラーを throw すると、予期しない何かが起こり、実行の通常の流れが継続できないことをあなたに示すことができます。エラーを throw する throw 文を使用して下さい。たとえば、以下のコードでは、5 つの追加のコインが自動販売機で必要とされていることを示すためにエラーが throw されます。


throw VendingMachineError.insufficientFunds(coinsNeeded: 5)


エラーの処理


エラーが throw されると、コードの周囲のある部分は、例えば、問題を修正する事によって、別のアプローチを試みて、失敗したユーザに知らせることによって、エラーを処理するための責任を負わなければなりません。


Swift にはエラーを処理するため 4 つの方法があります。do-catch 文を使用してエラーを処理し、その関数を呼び出すコードに関数からエラーを伝播でき、optional の値としてエラーを処理し、またはエラーが発生しないことを主張する (assert) ことができます。各アプローチは、以下のセクションで説明します。


関数がエラーを throw した場合、それはあなたのプログラムの流れを変えるので、あなたがすぐにエラーを throw することができる、コード内の場所を識別できることが重要です。あなたのコード内でこれらの場所を識別するには、エラーを throw できる関数、メソッド、またはイニシャライザを呼び出すコードの一部の前に try キーワードまたは try?try! バリエーションを書きます。これらのキーワードは、以下のセクションで説明します。


注意: Swift のエラー処理では、try,catchthrow キーワードの使用については、他の言語での例外処理に似ています。Objective-C を含む多くの 言語の例外処理とは異なり、Swift のエラー処理はスタックを呼び出すのをほどくのを含まず、計算上高価になりうるプロセスです。このように、throw 文の性能特性は、return 文のものに匹敵します。


throw 関数を使用したエラーの伝播


関数、メソッド、またはイニシャライザがエラーを throw できることを示すには、その関数の宣言内に、パラメータの後に throw キーワードを書いてください。throw でマークされた関数は、throw する関数 と呼ばれます。関数が、戻り値の型を指定する場合は、戻り矢印(->)の前に throw キーワードを書きます。


  1. func canThrowErrors() throws -> String
  2. func cannotThrowErrors() -> String


throw する関数は、それを呼び出している所から範囲へと、その中に throw されるエラーを伝播します。


注意: throw する関数だけがエラーを伝播させることができます。throw しない関数の内部で throw されたエラーは、関数の内部で処理されなければなりません。


以下の例では、VendingMachine クラスには、要求された項目が使用できなければ、在庫切れのため、または現在入れた通貨の量を超えるコストの場合は、適切な VendingMachineError を throw する vend(itemNamed:) メソッドがあります。


  1. struct Item {
  2.         var price: Int
  3.         var count: Int
  4. }
  5. class VendingMachine {
  6.         var inventory = [
  7.                 "Candy Bar": Item(price: 12, count: 7),
  8.                 "Chips": Item(price: 10, count: 4),
  9.                 "Pretzels": Item(price: 7, count: 11)
  10.         ]
  11.         var coinsDeposited = 0
  12.         func vend(itemNamed name: String) throws {
  13.                 guard let item = inventory[name] else {
  14.                         throw VendingMachineError.invalidSelection
  15.                 }
  16.                 guard item.count > 0 else {
  17.                         throw VendingMachineError.outOfStock
  18.                 }
  19.                 guard item.price <= coinsDeposited else {
  20.                         throw VendingMachineError.insufficientFunds(coinsNeeded: item.price -
    coinsDeposited
    )
  21.                 }
  22.                 coinsDeposited -= item.price
  23.                 var newItem = item
  24.                 newItem.count -= 1
  25.                 inventory[name] = newItem
  26.                 print("Dispensing \(name)")
  27.         }
  28. }

vend(itemNamed:) メソッドの実装は、早くメソッドを終了し、スナックを購入するための要件のいずれかが満たされていない場合は、適切なエラーを throw するように guard 文を使用しています。throw 文はすぐにプログラム制御を転送するので、アイテムはこれらの要件のすべてを満たしている場合にのみ販売されます。


vend(itemNamed:) メソッドは、それが throw する全てのエラーを伝播するので、このメソッドを呼び出す全てのコードは do-catch 文、try? または try! を使用して、エラーを処理するか伝播し続けなければなりません。例えば、以下の例の buyFavoriteSnack(person:vendingMachine:) 関数も、throw する関数であり、vend(itemNamed:) メソッドが throw した全てのエラーは buyFavoriteSnack(person:vendingMachine:) 関数が呼び出された時点まで伝播します。


  1. let favoriteSnacks = [
  2.         "Alice": "Chips",
  3.         "Bob": "Licorice",
  4.         "Eve": "Pretzels",
  5. ]
  6. func buyFavoriteSnack(person: String, vendingMachine: VendingMachine) throws {
  7.         let snackName = favoriteSnacks[person] ?? "Candy Bar"
  8.         try vendingMachine.vend(itemNamed: snackName)
  9. }


この例では、buyFavoriteSnack(person: vendingMachine:) 関数は、与えられた人のお気に入りのスナックを検索し、vend(itemNamed:) メソッドを呼び出すことによって、彼らのためにそれを購入しようとします。 vend(itemNamed:) メソッドはエラーを throw できるので、その前の try キーワードで呼び出されます。


throw するイニシャライザは throw する関数と同じようにエラーを伝播できます。たとえば、下に挙げたリスト内の PurchasedSnack 構造体のイニシャライザは、初期化プロセスの一部として throw する関数を呼び出し、呼び出し元にそれらを伝播させることによって発生したエラーを処理します。


  1. struct PurchasedSnack {
  2.         let name: String
  3.         init(name: String, vendingMachine: VendingMachine) throws {
  4.                 try vendingMachine.vend(itemNamed: name)
  5.                 self.name = name
  6.         }
  7. }


Do-Catch を使用したエラー処理


コードのブロックを実行して、エラーを処理するために、do-catch 文を使用して下さい。エラーが do 句内のコードによって throw された場合は、そのうちの一つがエラーを処理できるかどうかを決定するために catch 句と一致させられます。


ここで do-catch 文の一般的な形式を挙げます。


    do {


    try


           


    } catch {


           


    } catch where {


           


    }



句が処理できるエラーを示すために、catch の後にパターンを書いて下さい。catch 句が、パターンを持っていない場合、句は任意のエラーに一致し、ローカル定数の error にエラーを結合します。パターン一致の詳細については、パターン を参照してください。


catch 節は、その do 句内のコードが throw できるコード内のすべての起きうるエラーを処理する必要はありません。catch 句のいずれもエラーを処理しない場合、エラーは周囲の範囲に伝播します。しかし、エラーは周囲のスコープの いずれか を囲むことにより処理されなければならず、エラーを処理する、取り巻く do-catch 句によって、または throw する関数内で処理しなければなりません。たとえば、以下のコードは、VendingMachineError 列挙型のすべての 3 つのケースを処理しますが、他のすべてのエラーは、その周囲の範囲によって処理されなければなりません:


  1. var vendingMachine = VendingMachine()
  2. vendingMachine.coinsDeposited = 8
  3. do {
  4.         try buyFavoriteSnack(person: "Alice", vendingMachine: vendingMachine)
  5. } catch VendingMachineError.invalidSelection {
  6.         print("Invalid Selection.")
  7. } catch VendingMachineError.outOfStock {
  8.         print("Out of Stock.")
  9. } catch VendingMachineError.insufficientFunds(let coinsNeeded) {
  10.         print("Insufficient funds. Please insert an additional \(coinsNeeded) coins.")
  11. }
  12. // Prints "Insufficient funds. Please insert an additional 2 coins."


上記の例では、buyFavoriteSnack(person:vendingMacine) 関数は、それがエラーを throw するので、try 式で呼び出されます。エラーが throw された場合、実行は伝播を続行できるかどうかを決定する、catch 句にすぐに転送します。エラーが全く throw されない場合、do 文の残りの文が実行されます。


エラー をOptional の値に変換


Optional の値に変換することによりエラーを処理するのに try? を使用して下さい。try? 式の評価中にエラーが throw された場合は、式の値は nil です。たとえば、以下のコードは、xy は同じ値と動作を持っています:


  1. func someThrowingFunction() throws -> Int {
  2.         // ...
  3. }
  4. let x = try? someThrowingFunction()
  5. let y: Int?
  6. do {
  7.         y = try someThrowingFunction()
  8. } catch {
  9.         y = nil
  10. }


someThrowingFunction() がエラーを throw する場合、xy の値は nil です。そうでなければ、xy の値は、関数が返した値です。xy は、someThrowingFunction() が返すどんな型の optional であってもよいと言う事に注意して下さい。ここで、関数は整数を返し、xy は optional の整数です。


try? を使うと、同じようにすべてのエラーを処理したいときに、簡潔なエラー処理コードを書くことができます。たとえば、以下のコードは、データをフェッチするためにいくつかのアプローチを使用し、またはアプローチのすべてが失敗した場合は nil を返します。


  1. func fetchData() -> Data? {
  2.         if let data = try? fetchDataFromDisk() { return data }
  3.         if let data = try? fetchDataFromServer() { return data }
  4.         return nil
  5. }


エラー伝播を無効に


時には、throw する関数やメソッドが、実際には、実行時にエラーを throw しないとわかるかも知れません。これらの場面では、エラーの伝播を無効にするために式の前に try! と書くことができるし、エラーが throw されない実行時のアサーションで呼び出しを包み込めます。エラーが実際に throw された場合は、実行時エラーが発生します。


たとえば、以下のコードは、与えられたパスにイメージリソースをロードするか、イメージがロードできない場合にエラーを throw する loadImage(atPath:) 関数を使用しています。この場合、画像はアプリケーションと共に同梱されているため、エラーは実行時に throw されませんので、エラーの伝播を無効にすることが適切です。


let photo = try! loadImage(atPath: "./Resources/John Appleseed.jpg")



クリーンアップアクションの指定


コードの実行がコードの現在のブロックを離れる直前の文のセットを実行するために defer 文を使用して下さい。この文を使用すると、エラーがスローされたために終了するか、returnbreak などの文が原因で終了するかにかかわらず、実行する必要があるクリーンアップを実行できます。たとえば、defer 文を使用して、ファイル記述子が閉じられ、手動で割り当てられたメモリが解放されていることも確認できます。


現在の範囲が終了するまで defer 文は実行を延期します。この文は、defer キーワードで構成され、文は、後で実行されます。defer 文は、エラーを throw するか、break または return 文のような文のうち、制御を移すことになる全てのコードを含めることはできません。defer アクションは、それらがあなたのソースで書かれた順序とは逆に実行されます。すなわち、最初の defer 文のコードは最後に実行され、第二のコードの defer 文は最後から2番目に実行され、という順序で実行されます。ソースコード順の最後の defer 文は最初に実行されます。


  1. func processFile(filename: String) throws {
  2.         if exists(filename) {
  3.                 let file = open(filename)
  4.                 defer {
  5.                         close(file)
  6.                 }
  7.                 while let line = try file.readline() {
  8.                         // Work with the file.
  9.                 }
  10.                 // close(file) is called here, at the end of the scope.
  11.         }
  12. }


上記の例では、open(_:) 関数が対応する close(_:) への呼び出しを持っていることを確認するために defer 文を使用しています。


注意: エラー処理コードが全く含まれなくても defer 文を使用できます。





前:Optional の連鎖 次:型キャスト
目次
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 句
    汎用引数句
  • 文法のまとめ
  • 語彙の構造



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