アクセス制御


アクセス制御 は、他のソースファイルやモジュール内のコードからの、あなたのコードの部分へのアクセスを制限します。この機能を使用すると、あなたのコードの実装の詳細を隠し、そのコードがアクセスして使用できる事を通して優先インターフェイスを指定できます。


特定のアクセスレベルを個々の型(クラス、構造体、及び列挙型) に割り当てられるだけでなく、それらの型に属しているプロパティ、メソッド、イニシャライザ、およびサブスクリプトに割り当てることができます。プロトコルは、特定の文脈に制限でき、グローバル定数、変数、関数も制限できます。


アクセス制御のさまざまなレベルを提供することに加えて、Swift は、典型的なシナリオのデフォルトのアクセスレベルを提供することによって、明示的なアクセス制御レベルを指定する必要性を低減します。実際、一つのターゲット用アプリを作成している場合は、明示的なアクセス制御レベルを指定する必要は全くありません。



注意: アクセス制御があるコードの様々な態様が適用され、(プロパティ、型、関数など) それを簡潔にするために、以下のセクションでは "実体(entity)" と呼びます。


モジュールとソースファイル


Swift のアクセス制御モデルは、モジュールとソースファイルの概念に基づいています。


モジュール は、一つのコード配布ユニットであり、それは Swift の import キーワードで別のモジュールによってインポートできる一つのユニットとしてビルドされ出荷されるフレームワークやアプリケーションです。


Xcode での各ビルドターゲット(アプリバンドルやフレームワークのように) は、 Swift で独立したモジュールとして扱われます。もし、スタンドアロンのフレームワークとしてアプリのコードの特徴を一緒にまとめると、多分多数のアプリケーションにまたがってそのコードをカプセル化し再利用し、インポートされアプリ内で使用される時、そのフレームワーク内で定義する全ての物は、それが他のフレームワーク内で使われる場合別のモジュールの一部になります。


ソースファイル はモジュール内の一つの Swift のソースコードファイルです。(実際には、アプリやフレームワーク内の一つのファイル) 別のソースファイル内の個々の型を定義することが一般的ですが、一つのソースファイルは、複数の型、関数、などの定義を含めることができます。



アクセスレベル


Swift は、コード内の実体に五つの異なる アクセスレベル を提供します。これらのアクセスレベルは、そのソースファイルが属するモジュールにも関係があり、実体が定義されているソースファイルにも関係があります。


Open アクセスは最高の (最も制限のない) アクセスレベルであり、private アクセスは最低の (最も制限のある) アクセスレベルです。


Open アクセスは、クラスとクラスメンバーにのみ適用され、以下のように public アクセスとは異なります。


open としてクラスをマークすると、スーパークラスとしてそのクラスを使用している他のモジュールからのコードの影響を考慮したことを明示的に示し、それに応じて自分のクラスのコードを設計したことを示します。


アクセスレベルの全体的指針


Swift のアクセスレベルは、全体的な指針に従います:実体は低い (より制限する) アクセスレベルを持つ別の実体では定義できません。


例えば:


言語の異なる側面についての、この全体的指針の具体的な意味については、以下に詳細を述べます。



デフォルトのアクセスレベル


明示的なアクセスレベルを自分で指定していない場合 (この章で後述するように、いくつかの特定の例外を除いて) コード内の全ての実体はデフォルトの internal のアクセスレベルです。その結果、多くの場合、コード内で明示的なアクセスレベルを指定する必要はありません。



ターゲット一つのアプリのアクセスレベル


単純なターゲット一つのアプリを書くとき、アプリ内のコードは、一般的にアプリ内で自己完結しており、アプリのモジュールの外で利用可能にする必要はありません。デフォルトの internal アクセスレベルは、すでにこの要件に一致しています。そのため、カスタムのアクセスレベルを指定する必要はありません。ただし、アプリのモジュール内の他のコードから、それらの実装の詳細を隠すために、private または file private としてコードの一部をマークすることができます。



フレームワークのアクセスレベル


フレームワークを開発する場合、それが表示し、またフレームワークをインポートするアプリのような、他のモジュールによってアクセスできるように、open または public としてそのフレームワークに一般公開するインターフェイスをマークして下さい。この一般公開されているインターフェイスは、フレームワーク用のアプリケーション·プログラミング·インターフェース(または API) です。



注意: フレームワークの internal コードの他の部分からそれらを隠したい場合は、フレームワークの internal 実装の詳細の全てを、internal のデフォルトのアクセスレベルをまだ使用可能であり、または private または file private としてマークできます。それをフレームワークの API の一部にしたい場合にのみ、open または public として実体をマークする必要があります。


ユニットテストのターゲット用のアクセスレベル


ユニットテストのターゲットでアプリを書くとき、あなたのアプリのコードはテストされるために、そのモジュールに利用可能にする必要があります。デフォルトでは、open または public とマークされた実体だけが、他のモジュールにアクセス可能です。しかし、ユニットテストのターゲットは、あなたが @testable 属性でプロダクトモジュールの import 宣言をマークした場合、全ての internal の実体にアクセスでき、テストを有効にして、そのプロダクトモジュールをコンパイルできます。


アクセス制御の構文


実体の導入部の前に、open、public、internal、fileprivate または private 修飾子のうち一つを配置することにより、実体のアクセスレベルを定義します。


  1. public class SomePublicClass {}
  2. internal class SomeInternalClass {}
  3. fileprivate class SomeFilePrivateClass {}
  4. private class SomePrivateClass {}
  5. public var somePublicVariable = 0
  6. internal let someInternalConstant = 0
  7. fileprivate func someFilePrivateFunction() {}
  8. private func somePrivateFunction() {}


特に指定がない限り、デフォルトのアクセスレベルは、デフォルトのアクセスレベル で記載したように、internal です。これは SomeInternalClasssomeInternalConstant が明示的なアクセスレベルの修飾子なしで書くことができ、また、internal のアクセスレベルがまだ有することを意味します。


  1. class SomeInternalClass {}                // implicitly internal
  2. let someInternalConstant = 0            // implicitly internal


カスタム型


カスタム型の明示的なアクセスレベルを指定したい場合は、型を定義する箇所で行ってください。新しい型は、そのアクセスレベルが許す所ならどこでも使用できます。例えば、file-private クラスを定義する場合、そのクラスは、プロパティの型としてのみ使用でき、または file-private クラスが定義されているソースファイル内の関数のパラメータや戻り値の型としてのみ使えます。


型のアクセス制御レベルもその型の メンバ (そのプロパティ、メソッド、イニシャライザ、及びサブスクリプト) のデフォルトのアクセスレベルに影響を与えます。private または file private として型のアクセスレベルを定義する場合、そのメンバのデフォルトのアクセスレベルも、private または file private になります。型のアクセスレベルを internal または public に定義する (または明示的にアクセスレベルを指定せずに internal のデフォルトのアクセスレベルを使用する) 場合は、型のメンバのデフォルトのアクセスレベルは、internal になります。


重要: public 型のデフォルトは public のメンバでなく internal のメンバを持ちます。型のメンバを pubic にしたい場合は、明示的にそのようにマークしなければなりません。この要件は、型に公開しようとする API が、公表しようとするものであり、誤って public API として型を internal の仕組みを提示するのを避けることが保証されます。


  1. public class SomePublicClass {                        // explicitly public class
  2.         public var somePublicProperty = 0        // explicitly public class member
  3.         var someInternalProperty = 0                // implicitly internal class member
  4.         fileprivate func someFilePrivateMethod() {} // explicitly file-private class member
  5.         private func somePrivateMethod() {}    // explicitly private class member
  6. }
  7. class SomeInternalClass {                        // implicitly internal class
  8.         var someInternalProperty = 0                // implicitly internal class member
  9.         fileprivate func someFilePrivateMethod() {} // explicitly file-private class member
  10.         private func somePrivateMethod() {}    // explicitly private class member
  11. }
  12. fileprivate class SomeFiePrivateClass {                // explicitly file-private class
  13.         func someFilePrivateMethod () {}                 // implicitly file-private class member
  14.         private func somePrivateMethod() {}                // explicitly private class member
  15. }
  16. private class SomePrivateClass {                        // explicitly private class
  17.         func somePrivateMethod() {}                        // implicitly private class member
  18. }


タプル型


タプル型のアクセスレベルは、そのタプルに使用された全ての型の最も制限されるアクセスレベルです。例えば、2つの異なる型で、一つは internal アクセスでもう一つは private アクセスの場合、その合成されたタプル型のアクセスレベルは、private になります。



注意: タプル型には、クラス、構造体、列挙型、および関数が行うような、スタンドアロンの定義方法がありません。タプル型のアクセスレベルは、タプル型を使用するときに自動的に推論され、明示的に指定することはできません。


関数型


関数型のアクセスレベルは、関数のパラメータの型と戻り値の型の最も制限されるアクセスレベルとして計算されます。関数の計算されたアクセスレベルが、文脈のデフォルトと一致しない場合は、関数の定義の一部として明示的にアクセスレベルを指定しなければなりません。


以下の例では、関数自体のための特定のアクセスレベル修飾子を提供することなく、someFunction() というグローバル関数を定義しています。この関数は、"internal" のデフォルトのアクセスレベルがあるように期待するかもしれませんが、これは当てはまりません。実際には、someFunction() を以下のように書いてもコンパイルされません。


  1. func someFunction() -> (SomeInternalClass, SomePrivateClass) {
  2.         // function implementation goes here
  3. }


関数の戻り値の型は、カスタム型 の、上で定義された2つのカスタムクラスから成るタプル型です。これらのクラスの一つは、"internal" と定義され、他方は "private" と定義されました。したがって、合成されたタプル型の全体的なアクセスレベルは "private" です (タプルを構成する型の最小のアクセスレベル)。


関数の戻り値の型は private であるため、関数の全体的なアクセスレベルは関数宣言を有効にするには private 修飾子でマークしなければなりません。


  1. private func someFunction() -> (SomeInternalClass, SomePrivateClass) {
  2.         // function implementation goes here
  3. }


public または internal 修飾子で someFunction() の定義をマークするのは無効ですし、または関数の public または internal ユーザーが、関数の戻り値の型で使用される private クラスへの適切なアクセス権を持っていない可能性があるため、internal のデフォルト設定を使用することは無効です。



列挙型


列挙型の個々のケースは自動的に、それらが属する列挙型と同じアクセスレベルを受けます。個々の列挙型の case ごとに異なるアクセスレベルを指定することはできません。


以下の例では、CompassPoint 列挙型には、明示的に public のアクセスレベルがあります。列挙型の case は north、south、east、そして west であり、したがって、また public のアクセスレベルです:


  1. public enum CompassPoint {
  2.         case north
  3.         case south
  4.         case east
  5.         case west
  6. }


生の値と関連する値


列挙型の定義内の全ての生の値または関連する値に使用される型は、列挙型のアクセスレベルと少なくとも同じ高さのアクセスレベルでなければなりません。例えば、internal アクセスレベルを持つ列挙型の生の値の型として private 型を使用することはできません。



ネストした型


private 型内で定義されたネストした型は、自動的に private のアクセスレベルです。file-private 型内で定義されたネストした型は、自動的に file private のアクセスレベルです。public 型または internal 型内で定義されたネストした型は、自動的に internal のアクセスレベルです。公的に利用可能にしたい public の型内のネストした型が欲しい場合は、明示的に public としてネストした型を宣言しなければなりません。


サブクラス化


現在のアクセスの文脈でアクセスできる全てのクラスをサブクラス化できます。サブクラスはそのスーパークラスより高いアクセスレベルとする事はできません。例えば、internal のスーパークラスの public サブクラスを書く事はできません。


さらに、特定のアクセスの文脈に表示されている全てのクラスのメンバ (メソッド、プロパティ、イニシャライザ、またはサブスクリプト) をオーバーライドすることができます。


オーバーライドは、スーパークラスのバージョンより、継承したクラスのメンバを、アクセスしやすくできます。以下の例では、クラス A は、someMethod() という file-private メソッドを持つ public クラスです。クラス BA のサブクラスで、少し下がった "internal" のアクセスレベルです。それにもかかわらず、クラス B は、someMethod() の元の実装よりも 高い、"internal" のアクセスレベルで someMethod() のオーバーライドを提供します。


  1. public class A {
  2.         private func someMethod() {}
  3. }
  4. internal class B: A {
  5.         override internal func someMethod() {}
  6. }


サブクラスのメンバが、サブクラスメンバよりも低いアクセス権限を持つスーパークラスのメンバを呼び出すこともなお有効であり、スーパークラスのメンバへの呼び出しが、許可されたアクセスレベルの文脈内で行われる限り (すなわち、file-private メンバの呼び出すスーパークラスと同じソースファイル内で、または internal メンバーの呼び出すスーパークラスと同じモジュール内で):


  1. public class A {
  2.         private func someMethod() {}
  3. }
  4. internal class B: A {
  5.         override internal func someMethod() {
  6.                 super.someMethod()
  7.         }
  8. }


スーパークラス A 及びサブクラス B が同じソースファイル内で定義されているため、someMethod()B の実装が super.someMethod() を呼び出すことは有効です。



定数、変数、プロパティ、およびサブスクリプト


定数、変数、またはプロパティは、その型よりも public にすることはできません。例えば、private 型の public プロパティを書くことは無効です。同様に、サブスクリプトは、そのインデックス型または戻り値の型のどちらかより public にすることはできません。


定数、変数、プロパティ、またはサブスクリプトが、private 型を使用する場合、定数、変数、プロパティ、またはサブスクリプトは、private としてもマークされなければなりません:


private var privateInstance = SomePrivateClass()



ゲッタとセッタ


定数、変数、プロパティ、そしてサブスクリプトのゲッタとセッタは、それらが属する定数、変数、プロパティ、またはサブスクリプトと同じアクセスレベルを自動的に受け取ります。


その変数、プロパティ、またはサブスクリプトの読み書き範囲を制限することを、セッタにその対応するゲッタより 低い アクセスレベルを与えることができます。var または subscript 導入部の前に fileprivate(set),private(set) または internal(set) を書いて、より低いアクセスレベルを割り当てて下さい。



注意: この規則は、格納されたプロパティだけでなく、計算されたプロパティにも適用されます。格納されたプロパティに明示的なゲッタとセッタを書いていないにもかかわらず、Swift はまだ格納されたプロパティの記憶装置へのアクセスを提供するための暗黙のゲッタとセッタを合成します。計算されたプロパティの明示的なセッタの場合とまったく同じように、この合成されたセッタのアクセスレベルを変更するには、fileprivate(set),private(set)internal(set) を使用してください。


以下の例は、文字列プロパティが変更された回数を追跡する TrackedString という構造体を定義しています。


  1. struct TrackedString {
  2.         private(set) var numberOfEdits = 0
  3.         var value: String = "" {
  4.                 didSet {
  5.                         numberOfEdits += 1
  6.                 }
  7.         }
  8. }


TrackedString 構造体は、"" (空の文字列) の初期値で、value と言う格納された文字列プロパティを定義しています。構造体はまた、その value が変更された回数を追跡するために使用される numberOfEdits という格納された整数プロパティも定義しています。この変更の追跡は value プロパティが新しい値に設定されるたびに value プロパティが numberOfEdits を増分する、didSet プロパティ監視者を用いて実装されています。


TrackedString 構造体と value プロパティは、明示的なアクセスレベル修飾子を提供しないので、これら両方は、internal のデフォルトのアクセスレベルを受け取ります。しかし、numberOfEdits プロパティのアクセスレベルは、プロパティのゲッタはまだ internal のデフォルトのアクセスレベルを持っていることを示すために、private(set) 修飾子でマークされますが、プロパティは TrackedString 構造体の一部であるコード内からのみ設定可能です。これは、TrackedStringnumberOfEdits プロパティを内部で変更可能にしますが、それは構造体の定義の外で使用されている場合、読み取り専用のプロパティとしてプロパティを提示します。


何回か TrackedString のインスタンスを作成し、その文字列値を変更すると、変更の回数と一致するように numberOfEdits プロパティ値が更新するのを見ることができます:


  1. var stringToEdit = TrackedString()
  2. stringToEdit.value = "This string will be tracked."
  3. stringToEdit.value += " This edit will increment numberOfEdits."
  4. stringToEdit.value += " So will this one."
  5. print("The number of edits is \(stringToEdit.numberOfEdits)")
  6. // prints "The number of edits is 3"


別のソースファイル内から numberOfEdits プロパティの現在値を照会できますが、別のソースファイルからプロパティを 変更 することはできません。その機能性の側面への便利なアクセスを提供しながら、この制限は、TrackedString 編集追跡機能の実装の詳細を保護します。


もし必要であれば、ゲッタとセッタの両方に明示的なアクセスレベルを割り当てられることに注意してください。以下の例は、構造体が public の明示的なアクセスレベルで定義されている TrackedString 構造体のバージョンを示しています。構造体のメンバ (numberOfEdits プロパティを含む) は、そのため、デフォルトでは、internal のアクセスレベルです。publicprivate(set) アクセスレベル修飾子を組み合わせることで、構造体の numberOfEdits プロパティのゲッタを public に、そのプロパティのセッタを private にできます。


  1. public struct TrackedString {
  2.         public private(set) var numberOfEdits = 0
  3.         public var value: String = "" {
  4.                 didSet {
  5.                         numberOfEdits += 1
  6.                 }
  7.         }
  8.         public init() {}
  9. }



イニシャライザ


カスタムのイニシャライザは、それらが初期化する型に等しいか、より少ないアクセスレベルを割り当てられます。(必須イニシャライザ で定義されたように) 唯一の例外は、必須イニシャライザです。必須イニシャライザは、それが属するクラスと同じアクセスレベルでなければなりません。


関数とメソッドのパラメータと同様に、イニシャライザのパラメータの型は、イニシャライザ自身のアクセスレベルよりも private にすることはできません。



デフォルトのイニシャライザ


デフォルトのイニシャライザ で説明したように、Swift は、そのすべてのプロパティのデフォルト値を提供し、少なくとも一つのイニシャライザを自身で提供しない、全ての構造体または基本クラスの引数なしの デフォルトのイニシャライザ を自動的に提供します。


デフォルトのイニシャライザは、その型が public として定義されていない限り、それが初期化する型と同じアクセスレベルになります。public として定義されている型の場合、デフォルトのイニシャライザは、internal とみなされます。別のモジュールで使用する時、public 型を引数なしのイニシャライザで初期化可能にしたい場合は、明示的に public の引数なしで、型の定義の一部としてあなた自身でイニシャライザを提供しなければなりません。



構造体型用のデフォルトメンバ化イニシャライザ


構造体の格納されたプロパティのいずれかが private であれば構造体型のデフォルトのメンバ化イニシャライザは、private とみなされます。同様に、構造体の保存されたプロパティのいずれかが file private であれば、イニシャライザは file private です。それ以外の場合は、イニシャライザは、internal のアクセスレベルを持っています。


上記のデフォルトのイニシャライザと同じように、別のモジュールで使用する場合、public の構造体型をメンバ化イニシャライザで初期化可能にしたい場合は、public のメンバ化イニシャライザを型の定義の一部として自分自身で提供しなければなりません。



プロトコル


プロトコル型へ明示的なアクセスレベルを割り当てたい場合は、プロトコルを定義する箇所で行なってください。これで、特定のアクセス文脈内でだけ採用することが可能なプロトコルを作成できます。


プロトコルの定義内の各要件のアクセスレベルは自動的にプロトコルと同じアクセスレベルに設定されます。それがサポートするプロトコルと異なるアクセスレベルにプロトコル要件を設定することはできません。これは、プロトコルの要件のすべてがプロトコルを採用するあらゆる型に見えることを保証します。



注意: public のプロトコルを定義して、それらが実装されている場合、プロトコルの要件は、それらの要件には public アクセスレベルを必要とします。この現象は、public 型定義が、型のメンバー用の internal のアクセスレベルを意味し、他の型とは異なります。


プロトコルの継承


既存のプロトコルから継承する新しいプロトコルを定義する場合、新しいプロトコルは、それが継承するプロトコルと同じアクセスレベルです。例えば、internal プロトコルから継承する public プロトコルを書くことはできません。



プロトコルの準拠


型は、型自体よりも低いアクセスレベルを持つプロトコルに準拠できます。たとえば、他のモジュールで使用可能な public 型を定義できますが、internal プロトコルへの準拠するモジュールは、internal プロトコルの定義モジュール内でのみ使用することができます。


型が、特定のプロトコルに準拠している文脈は、型のアクセスレベル及びプロトコルのアクセスレベルの最小値です。型が public だが、それが準拠するプロトコルは internal である場合、そのプロトコルに準拠する型も internal です。


プロトコルに準拠するように型を書いたり拡張するときは、各プロトコル要件の型の実装は、そのプロトコルに準拠する型と少なくとも同じアクセスレベルであることを確認しなければなりません。例えば、public 型が internal プロトコルに準拠している場合は、各プロトコル要件の型の実装は、少なくとも "internal" でなければなりません。



注意: Swift では、Objective-C のように、プロトコルの準拠は、グローバルであり、同じプログラム内では二つの異なる方法で型がプロトコルに準拠することは不可能です。



拡張機能


クラス、構造体、または列挙型を使用できる全てのアクセス文脈でクラス、構造体、または列挙型を拡張できます。拡張機能で追加された全ての型のメンバが、拡張された元の型で宣言された、型メンバと同じデフォルトのアクセスレベルです。public または internal 型を拡張した場合、追加した新しい型メンバは全て、internal のデフォルトのアクセスレベルです。file-private 型を拡張した場合は、追加した新しい全ての型メンバはデフォルトの file private アクセスレベルです。private 型を拡張した場合、追加した全ての新しいメンバは private のデフォルトのアクセスレベルです。


あるいは、extension (拡張機能) 内で定義された全てのメンバの新しいデフォルトのアクセスレベルを設定する (例えば、private extension) には明示的なアクセスレベル修飾子で extension をマークできます。この新しいデフォルトはまだ個別の型メンバの extension 内でオーバーライドできます。



拡張機能を使用してプロトコル準拠を追加する場合、拡張機能に明示的なアクセスレベル修飾子を指定することはできません。代わりに、プロトコルの独自のアクセスレベルを使用して、拡張機能内の各プロトコル要件の実装にデフォルトのアクセスレベルを提供します。


拡張機能の private メンバ


拡張するクラス、構造体、列挙型と同じファイル内にある拡張機能は、拡張機能内のコードが元の型の宣言の一部として記述されているかのように動作します。その結果、以下のことが可能になります。


この動作は、型に private の実体があるかどうかに関係なく、コードを整理するのと同じ方法で拡張機能を使用できることを意味します。例えば、以下の単純なプロトコルが与えられているとします。


  1. protocol SomeProtocol {
  2.         func doSomething()
  3. }


以下のように、拡張機能を使用してプロトコルへの準拠を追加することができます。


  1. struct SomeStruct {
  2.         private var privateVariable = 12
  3. }
  4. extension SomeStruct: SomeProtocol {
  5.         func doSomething() {
  6.                 print(privateVariable)
  7.         }
  8. }


汎用


汎用型または汎用関数のアクセスレベルは、汎用型または関数自体のアクセスレベルの最小値であり、その型パラメータの全ての型制約のアクセスレベルです。



型エイリアス


定義する全ての型エイリアスは、アクセス制御の目的のための別個の型として扱われます。型エイリアスは、それがエイリアスする型のアクセスレベル以下か等しいものです。たとえば、private 型エイリアスは、private、file-private、internal、public、または open 型をエイリアスできますが、public 型エイリアスは、internal、file-private または private 型をエイリアスすることはできません。



注意: この規則はまた、プロトコル準拠を満たすために使用される関連型の型エイリアスにも適用されます。





前:メモリの安全性 高度な演算子
目次
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 句
    汎用引数句
  • 文法のまとめ
  • 語彙の構造



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