アクセス制御
アクセス制御:コードは、発信者の設定に露出する必要があるかどうかを制御するために使用さは、例えば、など、いくつかのコードの実装の詳細を隠すことができ
- クラス、構造体、列挙の詳細設定にアクセスすることも
- 月のクラス(構造体、列挙型)属性、メソッド、アクセスレベルを設定する、など
- スウィフトは、いくつかの典型的なシナリオのためのアクセスのデフォルトレベルを提供し、私たちは、各セグメントのコードにアクセスを明示的にレベルを適用する必要はありません
ことに留意されたい
簡単にするために、コードを設けてもよい访问级别
特性(プロパティ、基本タイプ、機能、等)、次のセクションでは、「エンティティ」と呼びます
モジュールとソースファイル
基づくアクセス制御モデルでスウィフト模块
と源文件
これら二つの概念。
- モジュール:コードのモジュールは、単一のユニットに分配されます。例えば、フレームワークは、インポートキーワードを導入することによって、他のモジュールまたはプログラムすることができます
- ソースファイル:コードファイルで独自の新しいプロジェクトを開発
アクセスレベル
- スウィフトは、アクセスコードエンティティの5つのレベルを提供しています
コンテンツ | 説明 |
---|---|
開いた | 唯一のクラスのメンバーに作用することができますし、クラスを書き換えると継承を含め、誰でも使用することができます |
パブリック | これは、誰でも使用することができます。しかし、別のモジュールが上書きされ、継承、継承はこのモジュールで書き換えることができるされなくてもよいです |
内部(デフォルトのアクセスレベルは、修飾子は書く時間から書くことができます) | 修飾されたプロパティまたはメソッドは、ソースコード・モジュールが常駐を通してアクセスすることができます。フレームの内部全体にアクセスすることができ、フレームやライブラリのコードは、フレームが外部コードによって参照されている場合は、それにはアクセスできません。アプリケーションは、コードですが、また、全体のAppコードでも、内部のAppを通してアクセスすることができた場合 |
ファイル・プライベート | 修飾されたプロパティまたはメソッドは、現在のソースファイルにアクセスすることができます |
プライベート | 修飾されたプロパティまたはメソッドのアクセス・レベルは、現在のクラスにアクセスすることができます |
最高レベル(最低制限)へのオープンアクセス、プライベート最低アクセスレベル(最も制限)。
単一のターゲットアプリケーションのアクセスレベル
は、単一のターゲットAPPを書くとき、すべての機能は、他のアプリケーションまたはモジュールに提供する必要なしにアプリケーション・サービスに適用されているので、我々は明示的デフォルトを使用して、アクセスレベルを設定する必要はありません内部アクセスレベルをすることができます。しかし、あなたはまた、実装の詳細の機能の一部を非表示にするために使用fileprivateアクセスまたはプライベートアクセスレベルを、使用することができますフレームのアクセスレベル
あなたはフレームワークを開発し、我々は、ユーザーがその機能の通常の使用後のフレームをインポートできるように、いくつかの外部インタフェースは、オープンまたはpublicとして定義される必要があります。これらは、お使いの外部インタフェースは、フレームワークのAPIであると定義されている
フレームワークはまだあなたがfileprivateのアクセスまたはプライベートアクセスレベルを指定することができ、内部のデフォルトを使用します。APIフレームワークとしての実体は、必要性が明示的にオープンアクセスやパブリックアクセスレベルを割り当てることがときにしたいときユニットテスト対象のアクセスレベル
のアプリケーションをテストするためには、ユニットテストの対象が含まれている、テストモジュールは、アプリケーションのコードモジュールにアクセスする必要があります。オープンまたはパブリックのみエンティティレベルは、デフォルトでは、他のモジュールによってアクセスすることができます。その後、アプリケーションモジュール文を導入し、前@testable特性は(ビルド・オプション-テスト容易性を有効>)コンパイルセットのテストを許可する場合は、アプリケーション・モジュールをコンパイル、テストユニットは、ターゲット・アプリケーション・モジュールはすべての内部にアクセスすることができますレベルのエンティティ
アクセス制御構文
public class SomePublicClass {}
internal class SomeInternalClass {}
fileprivate class SomeFilePrivateClass {}
private class SomePrivateClass {}
public var somePublicVariable = 0
internal let someInternalConstant = 0
fileprivate func someFilePrivateFunction() {}
private func somePrivateFunction() {}
カスタム・タイプ
- カスタムアクセスレベルを持つクラスをしたい場合は、クラスの定義で指定することができます。新しいクラスは、その限界のアクセスレベル内でのみ使用することができます
fileprivate class SomeFilePrivateClass {
func someFilePrivateMethod() {}
func somePrivateMethod() {}
}
クラスのアクセスレベルはまた、メンバーの種類(プロパティ、メソッド、コンストラクタ、添字)デフォルトのアクセスレベルに影響を与えることができます。あなたがパブリックまたは内部としてクラスならばプライベートまたはfileprivateレベルとしてクラス、そのクラスのすべてのメンバーのアクセスのデフォルトレベルは、プライベートまたはfileprivateレベルになります(または明示的にアクセスレベルを指定しないと、デフォルトを使用する場合この型のすべてのメンバーのアクセスの)内部、デフォルトのレベルは、内部アクセスだろう
内部レベルへのパブリック型のデフォルトのすべてのメンバーのアクセスレベルではなく、公共のレベル。あなたが公共のレベルのメンバーを指定したい場合は、明示的に指定する必要があります。この方法の利点は、あなたが共通のインタフェースを定義する際に、誤って開いて内部インタフェースを回避するために内部的に使用され、開く必要があります正確にどのインターフェースを選択することができるということです
public class SomePublicClass { // 显式 public 类
public var somePublicProperty = 0 // 显式 public 类成员
var someInternalProperty = 0 // 隐式 internal 类成员
fileprivate func someFilePrivateMethod() {} // 显式 fileprivate 类成员
private func somePrivateMethod() {} // 显式 private 类成员
}
class SomeInternalClass { // 隐式 internal 类
var someInternalProperty = 0 // 隐式 internal 类成员
fileprivate func someFilePrivateMethod() {} // 显式 fileprivate 类成员
private func somePrivateMethod() {} // 显式 private 类成员
}
fileprivate class SomeFilePrivateClass { // 显式 fileprivate 类
func someFilePrivateMethod() {} // 隐式 fileprivate 类成员
private func somePrivateMethod() {} // 显式 private 类成员
}
private class SomePrivateClass { // 显式 private 类
func somePrivateMethod() {} // 隐式 private 类成员
}
- タプル型の
意思決定の最も厳しいタイプへのアクセスのタプルタプルレベルのアクセスレベルは、例えば、あなたはタプルの二つの異なるタイプを構築する場合は内部の一種である、含まれ、他のタイプはプライベートで、その後、プライベートタプルへのアクセスこのレベルの - 関数型
最も厳しいパラメータの型や戻り値の型のアクセスレベルに基づいてアクセスのレベルを決定するために、アクセスレベルの機能 - 列挙
アクセス列挙メンバーと列挙型の同じレベル、あなたが個別に列挙メンバーの異なるアクセスレベルを指定することはできません
サブクラス
- アクセスレベルサブクラスは親クラスのアクセスのレベルを超えてはならない、例えば、親クラスのアクセス・レベルは、内部で、アクセスレベルサブクラスは、公開することはできません
- これは、オーバーライドすることにより、継承されたクラスメンバーのアクセスのより高いレベルを提供することができます
public class ClassA{
fileprivate func run(){
}
}
internal class ClassB:ClassA{
override internal func run(){
super.run()
}
}
定数、変数、プロパティ、添字
定数、変数、属性は、このような公共のレベル属性の定義として、アクセスタイプ、彼らのレベル以上を持つことができない、それはレベルにアクセスすることはできません内部で
コンストラクタ
- アクセスのレベルから定義コンストラクタは、アクセスのレベルが属する以下であってもよいです。唯一の例外が属する同じタイプである必要があり、必要なコンストラクタ、そのレベルおよびアクセスのレベルであります
- デフォルトコンストラクタのアクセスレベルとクラスが公開されていない限り、同じレベルのクラス、アクセスのレベルに属します。タイプは、公開レベルとして指定されている場合は、デフォルトコンストラクタのアクセスレベルは、内部になります。あなたはまた、他のモジュールで引数なしのデフォルトのコンストラクタを使用することができ、このタイプの公開レベルをしたい場合は、あなただけの引数なしのコンストラクタを自分のパブリックアクセスレベルを提供することができます
合意
- あなたが明示的にプロトコルのアクセスレベルを指定したい場合はプロトコルを定義するときは、次のように指定することができます。その後、契約は、アクセスレベルの制限の範囲内のみで使用することができます
- 契約の継承、新たな合意プロトコルの定義は、新しい契約は、同じプロトコルを継承可能なアクセスとアクセスレベルの最高レベルを持っている場合は、他からの継承。たとえば、公共の契約のための新しいプロトコルの定義の内部合意を継承することはできません
- タイプは、アクセスプロトコルのレベルよりも低い採用してもよいです。たとえば、パブリッククラスレベルを定義することができ、それは他のモジュールで使用することができ、それはまた、内部の合意のレベルを採用することができるが、唯一のモジュールでここで使用されているプロトコルに沿ったクラスとして合意
分類
- 拡張子がパブリックまたは内部型、内部メンバーのアクセスレベルのメンバーの使用の延長、およびデフォルトのタイプに元の契約を延長使用してください。あなたが拡張機能を使用する場合は、民間のタイプ、プライベートメンバーの既定のアクセスレベルの使用の拡張を拡張
- 従って、拡張プロトコルを使用して、あなたは明示的にアクセスレベルの拡張を宣言することはできません。プロトコルのデフォルトを使用することで、アクセスの必要なレベルを達成するために、各プロトコル拡張
ジェネリック
アクセスレベルジェネリック型またはジェネリック機能はアクセスレベルジェネリック型またはジェネリック関数自体に依存して、型制約型のパラメータのアクセスレベルを組み合わせる必要は、アクセスの最低レベルに応じて決定したアクセスレベルです