クラスと構造体


クラスと構造体 は、汎用で、プログラムのコードをビルドするブロックになる柔軟な構築物です。プロパティとメソッドを定義し、定数、変数、そして関数とまったく同じ構文を使って、クラスと構造体に、機能を追加します。


他のプログラミング言語とは異なり、Swift には、カスタムクラスや構造体のために別のインタフェースや実装ファイルを作成する必要はありません。Swift では、クラスや構造体を単一のファイル内に定義し、そのクラスまたは構造体への外部インタフェースは使用する他のコードに自動的に使用可能になります。


注意: クラス のインスタンスは、伝統的に オブジェクト として知られています。しかし、Swift のクラスや構造体は他の言語に比べて機能的に非常に近く、この章の多くは、クラスまたは構造体の型の いずれか のインスタンスに適用できる機能について説明します。このため、より一般的な用語の インスタンス が使用されています。


クラスと構造体を比較


Swift のクラスおよび構造体は多くの共通点を持っています。両方とも以下のことができます。


詳細については、プロパティメソッドサブスクリプト初期化拡張機能、および プロトコル を参照してください。


クラスは、構造体にはない追加の機能があります。


詳細については、継承型キャストデイニシャライザ、および 自動参照カウント を参照してください。


注意: コード内で渡される時、構造体は常にコピーされ、参照カウントを使用しません。


定義の構文


クラスと構造体は類似の定義構文を持っています。class キーワードでクラスを導入し、struct キーワードで構造体を導入します。どちらも中括弧のペアの中にそれら全体の定義を置きます。


  1. class SomeClass {
  2.         // class definition goes here
  3. }
  4. struct SomeStructure {
  5.         // structure definition goes here
  6. }


注意: 新しいクラスや構造体を定義するたびに、効果的に全く新しい Swift の型を定義します。 UpperCamelCase と言う名前の型を(ここでは SomeClassSomeStructure のように) 標準の Swift 型の大文字で始めたものと一致するようにします(String、Int、 および Bool のように)。逆に、常にプロパティとメソッドには、型の名前と区別するために、(frameRateincrementCount などのように) それらに lowerCamelCase 名を与えて下さい。


ここで構造体の定義とクラスの定義の例を示します。


  1. struct Resolution {
  2.         var width = 0
  3.         var height = 0
  4. }
  5. class VideoMode {
  6.         var resolution = Resolution()
  7.         var interlaced = false
  8.         var frameRate = 0.0
  9.         var name: String?
  10. }


上記の例では、ピクセルをベースにしたディスプレイ解像度を記述するために、Resolution という新たな構造体を定義しています。この構造体には、widthheight と言う二つの格納されたプロパティがあります。格納されたプロパティは、クラスまたは構造体の一部として束ねられ、格納された定数あるいは変数です。この2つのプロパティは、それらを 0 の整数に初期値を設定することで、Int 型であることが推測されます。


上記の例では、また、ビデオ表示用の特定のビデオモードを説明するために、VideoMode という新しいクラスを定義しています。このクラスは、4つの格納された変数のプロパティを持っています。最初に、 resolution は、Resolution のプロパティ型を推測する、新しい Resolution の構造体インスタンスで初期化されます。他の3つのプロパティの場合、新しい VideoMode インスタンスは interlaced 設定が false で初期化され("ノンインターレースビデオ" を意味します)、0.0 の再生フレームレート、および name と呼ばれる optional の String 値で初期化されます。それは、optional の型であるため、name プロパティは、自動的に、nil のデフォルト値、または "name のない値" が与えられます。



クラスと構造体のインスタンス


Resolution 構造体の定義と VideoMode クラスの定義は、ResolutionVideoMode がどう似ているかについて説明するだけです。それら自身は特定の resolution または Video Mode を記載していません。これを行なうには、構造体またはクラスのインスタンスを作成する必要があります。


インスタンスを作成するための構文は、構造体とクラスの両方に非常に似ています。


  1. let someResolution = Resolution()
  2. let someVideoMode = VideoMode()


構造体とクラスは、両方とも新しいインスタンス用のイニシャライザ構文を使用します。イニシャライザ構文の最も単純な形式は、Resolution()VideoMode() のように空の括弧が続くクラスまたは構造体の型名を使用します。これは、クラスまたは構造体の新しいインスタンスを作成し、それらのデフォルト値に全てのプロパティは初期化されます。クラスと構造体の初期化は、初期化 で、より詳しく記載されています。


プロパティにアクセス


ドット構文 を使用してインスタンスのプロパティにアクセスできます。ドット構文では、スペースを含まない、ピリオド (.) で区切られた、インスタンス名の直後にプロパティ名を書いて下さい。


  1. print("The width of someResolution is \(someResolution.width)")
  2. // prints "The width of someResolution is 0"


この例では、someResolution.widthsomeResolutionwidth プロパティを参照し、0 のデフォルトの初期値を返します。


VideoModeresolution プロパティの width プロパティのような、サブプロパティへと層を下がって行けます。


  1. print("The width of someVideoMode is \(someVideoMode.resolution.width)")
  2. // prints "The width of someVideoMode is 0"


また、変数プロパティに新しい値を割り当てるために、ドット構文を使用できます。


  1. someVideoMode.resolution.width = 1280
  2. print("The width of someVideoMode is now \(someVideoMode.resolution.width)")
  3. // prints "The width of someVideoMode is now 1280"


注意: Objective-C とは異なり、Swift は直接構造体プロパティのサブプロパティを設定できます。上記の最後の例では、someVideoModeresolution プロパティの width プロパティは、resolution プロパティ全体を新しい値に設定する必要なく、直接設定されています。


構造体型のためのメンバ化イニシャライザ


すべての構造体は、自動的に生成される メンバ化イニシャライザ を持っており、新しい構造体インスタンスのメンバプロパティを初期化するために使用できます。新しいインスタンスのプロパティの初期値は、名前でメンバ化イニシャライザに渡すことができます。


let vga = Resolution(width: 640, height: 480)



構造体とは異なり、クラス・インスタンスは、デフォルトのメンバ化イニシャライザを受け取りません。イニシャライザは、初期化 で詳しく記載されています。



構造体と列挙型は値型


値型 は、変数または定数に代入される場合、またはそれが関数に渡されるときに値が コピー される型です。


実際にこれまでの章を通して広範囲に亘って値型を使用してきました。実際に、Swift の基本的な型のすべては、整数、浮動小数点数、ブール値、文字列、配列、および辞書であり、値型は舞台裏では、構造体として実装されます。


すべての構造体と列挙型は Swift では値型です。これは、作成した構造体と列挙型の全てのインスタンスと、それらがプロパティとして持っている全ての値型は、それらがコード内で渡された場合、常にコピーされることを意味します。


前の例から Resolution の構造体を使用する、この例を考えてみましょう。


  1. let hd = Resolution(width: 1920, height: 1080)
  2. var cinema = hd


この例では、hd と言う定数を宣言し、フル HD ビデオの幅と高さ(幅 1920 ピクセル、高さ 1080 ピクセル) で初期化された Resolution インスタンスにそれを設定します。


その後、cinema と言う変数を宣言し、hd の現在値に設定します。Resolution は構造体であるため、既存のインスタンスの コピー が作成され、この新しいコピーは、cinema に代入されます。hdcinema は今や同じ幅と高さを持っているにもかかわらず、それらは舞台裏では2つの全く異なるインスタンスです。


次に、cinemawidth プロパティは、デジタルシネマ投影に使用されるわずかに広い 2K 規格の幅 (幅 2048 ピクセル、高さ 1080 ピクセル) に修正されます。


cinema.width = 2048



cinemawidth プロパティをチェックすると、それが実際に 2048 に変更されたことがわかります。


  1. print("cinema is now \(cinema.width) pixels wide")
  2. // prints "cinema is now 2048 pixels wide"


しかし、元の hd インスタンスの width プロパティは、まだ古い値の 1920 のままです:


  1. print("hd is still \(hd.width) pixels wide")
  2. // prints "hd is still 1920 pixels wide"


cinemahd の現在値を与えられたとき、hd に格納された は、新しい cinema インスタンスにコピーされました。最終結果は、2つの完全に異なるインスタンスとなり、ちょうど同じ数値を含む事にたまたまなりました。それらは別々のインスタンスであるため、cinema の width に 2048 を設定しても、hd に格納されている width には影響しません。


同じ動作は列挙型にも適用されます。


  1. enum CompassPoint {
  2.         case north, south, east, west
  3. }
  4. var currentDirection = CompassPoint.west
  5. let rememberedDirection = currentDirection
  6. currentDirection = .east
  7. if rememberedDirection == .west {
  8.         print("The remembered direction is still .west")
  9. }
  10. // prints "The remembered direction is still .west"


rememberedDirectioncurrentDirection の値を代入された時は、実際にはその値のコピーに設定されます。currentDirection の値を変更しても、その後それは rememberedDirection に格納されていた元の値のコピーには影響しません。



クラスは参照型


値型とは異なり、変数や定数に代入されている時やそれらが関数に渡された時は、参照型 はコピーされ ません。コピーではなく、同じ既存のインスタンスへの参照が代わりに使用されます。


ここで、上記で定義された VideoMode クラスを使用した例を挙げます。


  1. let tenEighty = VideoMode()
  2. tenEighty.resolution = hd
  3. tenEighty.interlaced = true
  4. tenEighty.name = "1080i"
  5. tenEighty.frameRate = 25.0


この例では、tenEighty という新しい定数を宣言し、VideoMode クラスの新しいインスタンスを参照するようにそれを設定します。ビデオモードは、以前からの 1920 * 1080 の HD 解像度のコピーが代入されています。これは、インターレースと設定され、"1080i" と言う名前が与えられています。最後に、毎秒 25.0 フレームのフレームレートに設定されています。


次に、tenEightyalsoTenEighty と言う新しい定数に代入され、alsoTenEighty の frmae rate (フレームレート) が変更されます。


  1. let alsoTenEighty = tenEighty
  2. alsoTenEighty.frameRate = 30.0


クラスは参照型なので、tenEightyalsoTenEighty は、実際にはどちらも 同じ VideoMode インスタンスを参照しています。事実上、それらは同じ一つのインスタンスの2つの異なる名前に過ぎません。


tenEightyframeRate プロパティをチェックすると、それは正しく、基礎となる VideoMode インスタンスから 30.0 の新しいフレームレートを報告することを示します。


  1. print("The frameRate property of tenEighty is now \(tenEighty.frameRate)")
  2. // prints "The frameRate property of tenEighty is now 30.0"


tenEightyalsoTenEighty は、変数ではなく、定数 として宣言されていることに注意してください。しかし、まだ tenEighty.frameRatealsoTenEighty.frameRate を変更できるのは、tenEightyalsoTenEighty 定数それ自体は実際には変更しないからです。tenEightyalsoTenEighty 自身は VideoMode インスタンスを "格納" せず、代わりに、それらは両方とも舞台裏で VideoMode インスタンスを 参照 しています。それは、VideoMode への定数の参照値ではなく、基本となる VideoMode の、frameRate プロパティが変更されます。



ID 演算子


クラスは参照型であるため、複数の定数や変数は舞台裏で、クラスの同じ一つのインスタンスを参照することが可能です。(それらが定数または変数に割り当てられている場合、または関数に渡される場合、常にコピーされるので、同じことは構造体と列挙型には当てはまりません。)


2つの定数または変数がクラスのインスタンスとまったく同じものを参照している事を見つけるのは時々役立ちます。これを有効にするのに、Swift は、2つの ID 演算子を提供しています。


2つの定数または変数が同じ一つのインスタンスを参照しているかどうかチェックするために、これらの演算子を使用して下さい。


  1. if tenEighty === alsoTenEighty {
  2.        print("tenEighty and alsoTenEighty refer to the same VideoMode instance.")
  3. }
  4. // prints "tenEighty and alsoTenEighty refer to the same VideoMode instance."


"全く同一である" (3つの等号、つまり === によって表される) 事は "等しい” (2つの等号、つまり == によって表される) と同じことを意味するものではないことに注意してください:


独自のカスタムクラスと構造体を定義する際には、2つのインスタンスが "等しい" という資格があるかを決めるのはあなたの責任です。"等しい" と "等しくない" 演算子の独自の実装を定義するプロセスは 等価演算子 に記述されています。



ポインタ


C、C++、または Objective-C の経験をお持ちの場合は、これらの言語では、ポインタ をメモリ内のアドレスの参照のために使用することを知っているかもしれません。いくつかの参照型のインスタンスを参照する Swift の定数または変数は、C でのポインタに似ていますが、メモリ内のアドレスへの直接のポインタではなく、また参照を作成していることを示すためにアスタリスク (*) を書く必要はありません。代わりに、これらの参照は、Swift の他の定数または変数のように定義されています。



クラスと構造体の間の選択


プログラムのコードのビルド中のブロックとして使うために、カスタムデータ型を定義するクラスと構造体の両方を使用できます。


しかし、構造体インスタンスは常に で渡され、クラスインスタンスは常に 参照 によって渡されます。これは、さまざまな種類のタスクにそれらが適していることを意味しています。プロジェクトに必要なデータ構造体と機能を検討するように、各データ構造体は、クラスまたは構造体として定義する必要があるかどうかを決定します。


一般的なガイドラインとして、以下の条件の1つ以上が適用する時に構造体を作成することを検討して下さい。


構造体が含む良い候補に挙げる例としては:


他のすべての場合では、クラスを定義し、そのクラスのインスタンスを、参照によって管理され、渡されるように作成します。実際に、これはほとんどのカスタムデータ構造物が、クラスであって、構造体でないことを意味します。



文字列、配列、辞書の代入とコピーの動作


Swift では String、Array および Dictionary のような基本的なデータ型は、構造体として実装されています。これは、それらが新しい定数または変数に代入される時、またはそれらが関数またはメソッドに渡される時に、文字列、配列、および辞書はコピーされることを意味します。


この動作は、構造体ではなく、クラスとして Foundation: で NSString、NSArray および NSDictionary として実装されている事とは異なっています。Foundation の 文字列、配列 および 辞書は、常にコピーとしてよりも、既存のインスタンスに常に代入され、参照として渡されます。



注意: 上記の説明は文字列、配列、および辞書の "コピー" を指します。コード内で見る動作は、常にコピーが行われたかのようになります。しかし、Swift は、そうすることが絶対に必要である時に舞台裏で 実際の コピーを実行するだけです。Swift は最適なパフォーマンスを確保するために、すべての値のコピーを管理しており、この最適化を先取りしようとする代入を避けるべきではありません。




前:列挙体 次:プロパティ
目次
Xcode 9 の新機能

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 句
    汎用引数句
  • 文法のまとめ
  • 語彙の構造



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