2016-02-09 14 views
18

Ich bin verwirrt über den internen und privaten Zugriffsmodifikator.Swift 2 intern vs. privat

Die docs sagt:

„Interner Zugang Einheiten ermöglicht innerhalb einer Quelldatei von ihrer Definition von Modul verwendet werden, aber nicht in einer Quelldatei außerhalb dieses Modul. Sie verwenden in der Regel den internen Zugriff, wenn eine App oder ein Rahmen der internen Struktur zu definieren.“

Wie ich dachte, es war, war, dass mit internen Sie alles zugreifen können, wenn Sie in Ihrer eigenen App sind. Aber das ist nicht wahr, denn wenn ich einen Viewcontroller habe, was ist Standard intern und ich habe eine interne Funktion auf diesem Viewcontroller kann ich nicht darauf zugreifen von einer anderen Datei in einer anderen Gruppe (Sie erstellen diese in xCode).

Was ich versuchte, war ein Viewcontroller hat, die eine Methode foo in der Gruppe A dann in der Gruppe B hat ich ein Viewcontroller wie folgt erstellt:

let vc: FakeViewController = FakeViewController() 
vc.foo() 

So ist intern an die gleiche Gruppe beschränkt? Oder interpretiere ich es falsch?

Ist es nützlich, dass Sie in einem Viewcontroller private Methoden und vars/lets erstellen?

+3

Was meinst du mit "Gruppe"? – zaph

+0

Die Gruppen, die Sie in xCode erstellen können. Ich weiß nicht, ob es etwas damit zu tun hat. – user1007522

+1

Die Gruppen haben keinen Einfluss auf die Zugriffskontrolle, sie sind lediglich ein Werkzeug zum Organisieren eines Projekts/Arbeitsbereichs. Die Dokumentation ist nicht falsch, also wenn Sie nicht von irgendwo auf eine 'interne Funktion 'zugreifen können, muss es sein, weil sie irgendwie in einem anderen Modul ist. –

Antwort

8

Der interne Zugriff beschränkt den Zugriff auf die Dateien innerhalb einer einzelnen Anwendung oder eines Frameworks.

Privat der Zugriff auf die einzelne Quelldatei, die Ihr Objekt erstellt in.

dies Siehe link für eine tiefe gehende Erklärung.

Wenn Ihre "Gruppe A" und "Gruppe B" sich in derselben Anwendung oder demselben Framework befinden, sollten Sie in der Lage sein, auf die Methoden von jedem zuzugreifen, vorausgesetzt, der viewController erlaubt internen Zugriff.

+3

Nicht ganz richtig, aus [Apple-Dokumentation] (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/ Swift_Programming_Language/AccessControl.html) Interner Zugriff ermöglicht die Verwendung von Entitäten innerhalb einer Quelldatei aus ihrem definierenden ** Modul **, aber nicht in einer Quelldatei außerhalb dieses ** Moduls **. Ein Modul! = Singuläre Anwendung oder Framework. Die Sprache in der zitierten Link ist ein wenig schlampig. – zaph

+0

Meine Gruppe A und B sind in dem gleichen Modul, denke ich. Es ist in der gleichen App. Das ist der verwirrende Teil des Moduls. – user1007522

+0

Der Kommentar von @Mike Pollard ist korrekt, Gruppen sind nichts als Organisation in Xcode, sie haben keinen Einfluss auf den Code oder die App. – zaph

0

Mein Verständnis ist, dass private nicht den Zugriff der Variablen von außerhalb dieser Klasse erlaubt. Es gibt jedoch Zeiten, wie mit Gestenerkennern, können Sie sie nicht privat machen, weil sie hinter den Kulissen benötigt werden. Wenn sie als "intern" gekennzeichnet sind, können sie von anderen Funktionen aus aufgerufen werden, aber nicht direkt aufgerufen werden.

Meistens verwende ich intern, um meinen Code organisiert zu halten, also weiß ich, dass das keine Public-Facing-Funktion ist, aber es kann immer noch verwendet werden.

+2

Nicht ganz richtig. 'privat' hat nichts mit Klassen zu tun. Es beschränkt den Zugriff auf die gleiche Quelldatei (Swift 2) oder auf den umschließenden Bereich (Swift 3). Beachten Sie, dass der umschließende Bereich sich nicht auf andere Erweiterungen erstreckt, wenn Sie etwas in einer Klassendefinition deklarieren. Auf diese Weise sind private Funktionen nicht in der gesamten Klasse verfügbar. – Tali

6

Angenommen, Sie 3 verschiedene View-Controller-Quelle haben Dateien A, B, C dann In Privat: - Wenn Intancses in einem Privat sind als nur Methoden der A ihnen In Intern verwenden können: - IF A als interne als B ist und C kann sie leicht benutzen. Hier ist ein Beispiel: enter image description here

Dank

2

@ user1007522 Könnten Sie den gesamten Quellcode für FakeViewController posten? Sie sollten Zugriff auf foo() von Ihrer VC-Variable haben. Wenn nicht, vermute ich, dass hier noch etwas anderes im Spiel ist.

fand ich die folgenden Definitionen viel einfacher zu verstehen (kopiert von UseYourLoaf - Swift 4 Access Levels)

Die fünf Zugriffsebene von Swift 3/4

Swift 3 fünf Zugriffsebene haben, aus der Quelldatei steuern oder Modul können Sie auf etwas zugreifen. Um von den meisten offen für die meisten eingeschränkt:

  • offen können Sie offene Klassen zugreifen und Klassenmitglieder aus jeder Quelldatei in dem definierende Modul oder einem anderen Modul, das das Modul importiert. Sie können eine offene Klasse ableiten oder ein offenes Klassenmitglied sowohl innerhalb ihres definierenden Moduls als auch jedes Moduls, das dieses Modul importiert, überschreiben.

  • public ermöglicht den gleichen Zugriff wie geöffnet - jede Quelldatei in jedem Modul - hat aber restriktiveres Unterklassen und Überschreiben. Sie können nur eine öffentliche Klasse innerhalb desselben Moduls ableiten. Ein öffentliches Klassenmitglied kann nur durch Unterklassen im selben Modul überschrieben werden. Dies ist wichtig, wenn Sie ein Framework schreiben. Wenn Sie möchten, dass ein Benutzer dieses Frameworks eine Klasse unterklassen kann oder eine Methode überschreiben kann, müssen Sie sie öffnen.

  • intern ermöglicht die Verwendung von jeder Quelldatei im definierenden Modul, aber nicht von außerhalb dieses Moduls. Dies ist im Allgemeinen die Standardzugriffsebene.

  • fileprivate kann nur innerhalb der definierenden Quelldatei verwendet werden.

  • privat Swift 4: ermöglicht die Verwendung nur von der einschließenden Erklärung und neue in Swift 4, auf alle Erweiterungen dieser Erklärung in derselben Quelldatei Swift 3: ermöglicht die Verwendung nur von der einschließenden Erklärung.