Swift 6.0 beta 日本語化計画 : Swift 6.0 beta


アクセス制御


宣言、ファイル、およびモジュールごとにコードの可視性を管理します。


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


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


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



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


モジュール、ソースファイル、パッケージ


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


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


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


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


パッケージ は、ユニットとして開発するモジュールのグループです。パッケージを構成するモジュールは、Swift ソースコードの一部としてではなく、使用しているビルドシステムの構成の一部として定義します。たとえば、Swift Package Manager を使用してコードをビルドする場合は、PackageDescription (PackageDescription) モジュールの API を使用して Package.swift ファイルでパッケージを定義し、Xcode を使用する場合は、パッケージアクセス識別子ビルド設定でパッケージ名を指定します。


アクセスレベル


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


  • Open アクセスPublic アクセス は、実体を、それらを定義しているモジュールから全てのソースファイル内で使用可能にし、また定義しているモジュールをインポートする別のモジュールからのソースファイルでも使用可能にします。フレームワークに public インターフェイスを指定するときは、一般的に open または public アクセスを使用して下さい。open と public アクセスの違いについては以下に説明します。

  • Package アクセス では、実体は定義パッケージの任意のソースファイル内で使用できるようになりますが、そのパッケージ外の全てのソースファイルでは使用できません。通常、package アクセスは、複数のモジュールに構造化されたアプリまたはフレームワーク内で使用します。

  • Internal アクセス は、実体を、それらを定義しているモジュールから全てのソースファイル内で使用可能にしますが、そのモジュール外の全てのソースファイルので使用できません。アプリやフレームワークの内部構造体を定義するときは、一般に、internal アクセスを使用して下さい。

  • File-private アクセス は、実体の使用を独自の定義ソースファイルへと制限します。file-private アクセスを使用して、特定の機能の実装の詳細がファイル全体内で使用されている場合、それらの実装の詳細を隠します。

  • Private アクセス は、実体の使用を、それを取り囲む宣言と、同じファイル内にあるその宣言の拡張機能に制限します。これらの詳細が単一の宣言内でのみ使用されている場合、特定の機能の実装の詳細を隠すには、private アクセスを使用します。

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


Open アクセスは、クラスとクラスメンバーにのみ適用され、サブクラス化 で後述するように、モジュールの外部のコードをサブクラス化してオーバーライドできるようにする点で public アクセスとは異なります。クラスを open として明示的にマークすることは、そのクラスをスーパークラスとして使用する他のモジュールからのコードの影響を考慮し、それに応じてクラスのコードをあなたが設計したことを示します。


アクセスレベルの基本指針


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


例えば:


  • public の変数は、public 変数が使用されている所どこでもその型が利用できるとは限らないので、internal、file-private または private 型を有するとして定義できません。

  • 関数の構成する型は周囲のコードに利用できない状況で使用される可能性があるため、関数は、そのパラメータ型と戻り値の型よりも高いアクセスレベルを持てません。

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



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


明示的なアクセスレベルをあなた自身で指定していない場合 (この章で後述するように、いくつかの特定の例外を除いて) コード内の全ての実体はデフォルトの 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. open class SomeOpenClass {}
  2. public class SomePublicClass {}
  3. internal class SomeInternalClass {}
  4. fileprivate class SomeFilePrivateClass {}
  5. private class SomePrivateClass {}
  6. open var someOpenVariable = 0
  7. public var somePublicVariable = 0
  8. internal let someInternalConstant = 0
  9. fileprivate func someFilePrivateFunction( ) {}
  10. 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 は自動的に、それらが属する列挙型と同じアクセスレベルを受けます。個々の列挙型の 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 型を使用することはできません。



ネストした型


入れ子になった (ネストした) 型のアクセスレベルは、含んでいる型が public でない限り、含んでいる型と同じです。public の型内で定義された、入れ子になった型には自動的に、internal のアクセスレベルです。public 型内の入れ子になった型をおおやけに (publicly) 使用可能にするには、入れ子になった型を public として明示的に宣言しなければなりません。


サブクラス化


現在のアクセスの文脈でアクセスできる全てのクラスをサブクラス化でき、それはサブクラスと同じモジュールで定義されています。また、異なるモジュール内で定義されている open なクラスもサブクラス化できます。サブクラスはそのスーパークラスより高いアクセスレベルとする事はできません。例えば、internal のスーパークラスの public サブクラスを書く事はできません。


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


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


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


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


  1. public class A {
  2. fileprivate 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),または package(set) を書いて、より低いアクセスレベルを割り当てて下さい。



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


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



拡張機能の private メンバ


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


  • 元の宣言で private メンバを宣言し、同じファイル内の拡張機能からそのメンバにアクセスします。

  • 1 つの拡張機能で private メンバを宣言し、同じファイル内の別の拡張機能からそのメンバにアクセスします。

  • 拡張機能内で 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 型をエイリアスすることはできません。


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


前:メモリの安全性 次:高度な演算子

<BETA SOFTWARE>
このドキュメントには、開発中の API または技術に関する予備的な情報が含まれています。この情報は変更されることがあり、このドキュメントに従って実装されたソフトウェアは、最終的なオペレーティングシステムソフトウェアでテストする必要があります。

Apple の Beta ソフトウエアについての詳細

















トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ