web-dev-qa-db-ja.com

Swift 3:パブリックアクセス修飾子と内部アクセス修飾子の違いは?

私はSwift 3.でアクセス修飾子に関するAppleのリファレンスを読みました。stackoverflowでも同じことを読みましたが、質問した人からの回答がありませんでした。正しく理解したように、 4つのレベル:

  1. オープン、パブリック
  2. 内部
  3. Fileprivate
  4. 民間

これらのすべての修飾子の違いを理解するために自分でスキームを作成し、アップロードした here をアップロードしました。ご覧のとおり、Public修飾子とInternal修飾子に違いはありません。しかし、それらは異なるレベルにあります。どんなアイデアでもいただければ幸いです!

13
shokuroff

あなたの図は正しくありません。

A.SwiftB.Swiftのパブリックメンバーは、C.SwiftD.Swiftが利用できます。唯一の制限は、クラスをサブクラス化できないことです(それらはopenである必要があります)。

2
Alexander
  • 内部-これはSwiftのデフォルトのアクセス指定子です。これにより、同じモジュール(ターゲット)内のデータメンバーとメンバー関数にアクセスできます。

  • パブリック-これは、同じモジュール内およびモジュール外のすべてのデータメンバーとメンバー関数にアクセスできる場所です。ただし、モジュールの外部でサブクラス化またはオーバーライドすることはできません。

  • Open-publicと同じですが、モジュールの外部でサブクラス化またはオーバーライドできる点のみが異なります。

  • Fileprivate-名前が言うように、データメンバーとメンバー関数は同じファイル内でアクセスできます。

  • Private-これは、関数本体またはクラスのスコープ内でアクセスできる場所です。

12
rahul katore

Swiftプログラミング言語の本Appleからのプログラミング言語の本は、これらのアクセス修飾子を明確に説明しています:

「Swiftは、コード内のエンティティに5つの異なるアクセスレベルを提供します。これらのアクセスレベルは、エンティティが定義されているソースファイルに関連しており、ソースファイルが属するモジュールにも関連しています。

オープンアクセスおよびパブリックアクセスにより、任意のソースファイル内でエンティティを使用できますそれらの定義モジュールから、および定義モジュールをインポートする別のモジュールからのソースファイルにもあります。フレームワークへのパブリックインターフェイスを指定するときは、通常、オープンアクセスまたはパブリックアクセスを使用します。オープンアクセスとパブリックアクセスの違いは次のとおりです。

内部アクセスを使用すると、エンティティを定義モジュールのソースファイル内で使用できますが、そのモジュール外のソースファイルでは使用できません。通常、アプリまたはフレームワークの内部構造を定義するときに内部アクセスを使用します。

File-privateアクセスは、エンティティの使用をそれ自体の定義ソースファイルに制限します。特定の機能の実装の詳細がファイル全体で使用されている場合、それらの実装の詳細を非表示にするには、ファイルプライベートアクセスを使用します。

Privateアクセスは、エンティティの使用を囲んでいる宣言に制限します。プライベートアクセスを使用して、特定の機能の実装の詳細が単一の宣言内でのみ使用される場合、それらの詳細を非表示にする

抜粋:Apple Inc.「Swiftプログラミング言語(Swift 3.1)。」iBooks。 https://itun.es/gb /jEUH0.l

7
rennarda

publicとしてマークしたものはすべて、アプリ内でもアプリ(モジュール)の外でも使用できます。何かをinternalとマークした場合、それはアプリ(モジュール)内でのみ使用できます。これは、ライブラリ(フレームワーク)を開発しているときに非常に役立ちます。internalを使用して、ライブラリ構造を非表示にすることができます。

6
Keaz

クラス、関数、またはプロパティのアクセス修飾子に依存し、サブクラス化、上書き、アクセス可能

アクセス修飾子は、classfield[約]method。これにアクセス、サブクラス化、またはオーバーライドしてみてください。

  • fieldまたはmethodへのアクセスはclassを介して行われます
  • 継承。後続のclass(サブクラス)アクセス修飾子は同じであるか、restrictit(private <-> fileprivateを除く)である必要があります。後続のmethod(override)アクセス修飾子は同じかexpandit

Javaアクセス修飾子

0
yoAlex5