web-dev-qa-db-de.com

Swift 2 intern vs. privat

Ich bin verwirrt über den internen und den privaten Zugriffsmodifizierer. 

Die Dokumente sagen:

„Der interne Zugriff ermöglicht die Verwendung von Entitäten in jeder Quelldatei von ihrem Definitionsmodul, aber nicht in einer Quelldatei außerhalb dieses Modul. Sie verwenden normalerweise den internen Zugriff, wenn Sie eine App oder eine .__ definieren. interne Struktur des Frameworks. "

Wie ich dachte, war es so, dass Sie mit internal auf alles zugreifen können, wenn Sie sich in Ihrer eigenen App befinden. Dies ist jedoch nicht der Fall, denn wenn ich einen Viewcontroller habe, der standardmäßig intern ist und ich eine interne Funktion für diesen Viewcontroller habe, kann ich nicht auf eine andere Datei in einer anderen Gruppe zugreifen (Sie erstellen diese in xCode). 

Ich habe versucht, einen ViewController zu haben, der eine Methode foo in Gruppe A hat. In Gruppe B habe ich einen ViewController wie folgt erstellt:

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

Ist intern also auf dieselbe Gruppe beschränkt? Oder ich interpretiere es falsch?

Ist es sinnvoll, dass Sie in einem Viewcontroller private Methoden und Vars/Lets erstellen?

23
user1007522

@ user1007522 Könnten Sie den gesamten Quellcode für FakeViewController bereitstellen? Sie sollten über Ihre Vc-Variable auf foo () zugreifen können. Wenn Sie dies nicht tun, vermute ich, dass hier etwas anderes im Spiel ist.

Ich fand die folgenden Definitionen viel einfacher zu verstehen (kopiert aus UseYourLoaf - Swift 4 Zugriffsebenen )

Die fünf Zugriffsebenen von Swift 3/4

Swift 3 verfügt über fünf Zugriffsebenen, die steuern, von welcher Quelldatei oder von welchem ​​Quellmodul aus Sie auf etwas zugreifen können. Um von den meisten offenen zu den meisten eingeschränkten:

  • open Sie können von jeder Quelldatei im Definitionsmodul oder von jedem Modul, das dieses Modul importiert, auf offene Klassen und Klassenmitglieder zugreifen. Sie können eine offene Klasse unterteilen oder ein offenes Klassenmitglied sowohl innerhalb ihres Definitionsmoduls als auch in jedem Modul, das dieses Modul importiert, überschreiben.

  • public erlaubt den gleichen Zugriff wie open - jede Quelldatei in einem Modul -, hat jedoch restriktivere Unterklassen und Überschreibungen. Sie können nur eine öffentliche Klasse innerhalb desselben Moduls unterteilen. Ein öffentlicher 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 subklassen oder eine Methode überschreiben kann, müssen Sie sie öffnen.

  • internal erlaubt die Verwendung von jeder Quelldatei im definierenden Modul, jedoch nicht von außerhalb dieses Moduls. Dies ist im Allgemeinen die Standardzugriffsebene.

  • fileprivate erlaubt die Verwendung nur innerhalb der definierenden Quelldatei.

  • private Swift 4: Erlaubt die Verwendung nur von der einschließenden und neu in Swift 4 enthaltenen Deklaration bis zu Erweiterungen dieser Deklaration in derselben Quelldatei. Swift 3: erlaubt die Verwendung nur aus der einschließenden Deklaration.

14

Der interne Zugriff beschränkt den Zugriff auf die Dateien in einer einzigen Anwendung oder einem Rahmen. 

Privat beschränkt den Zugriff auf die einzelne Quelldatei, in der Ihr Objekt erstellt wird. 

In diesem link finden Sie eine ausführlichere Erklärung.

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

9
Benjamin Lowry

Angenommen, Sie haben 3 verschiedene Ansichtssteuerungs-Quelldateien A, B, C Dann Privat: - Wenn die Intancse in A privat sind, können nur die Methoden von A sie verwenden als B und C können sie leicht verwenden. Hier ist ein Beispiel:  enter image description here

Vielen Dank 

7
singh.jitendra

Meines Wissens ist es nicht zulässig, dass auf die Variable von außerhalb dieser Klasse zugegriffen wird. Es gibt jedoch Zeiten wie bei Gestenerkennern, die Sie nicht privat machen können, da sie hinter den Kulissen benötigt werden. Wenn Sie sie als "intern" markieren, können Sie von anderen Funktionen aus darauf zugreifen, aber nicht direkt aufrufen.

Meistens verwende ich internal, um meinen Code zu organisieren, also weiß ich, dass dies keine öffentliche Funktion ist, aber trotzdem verwendet werden kann.

0
EdwardSanchez