Was ist ein gutes Beispiel, um in Swift3 zwischen Dateiprivat und Privat zu unterscheiden?
Diese Artikel wurde hilfreich für das Verständnis des neuen Zugriffsbezeichner in Swift 3
. Es gibt auch einige Beispiele für die unterschiedlichen Verwendungen von fileprivate
und private
.
Meine Frage ist - ist das nicht mit fileprivate
auf eine Funktion, die benutzt wird, nur in dieser Datei das gleiche wie mit private
?
InformationsquelleAutor der Frage Nikita P | 2016-08-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
fileprivate
ist jetzt das, wasprivate
verwendet werden, die in früherenSwift-releases: erreichbar von
der gleichen Quelle-Datei. Eine Erklärung markiert als
private
jetzt kann nur zugegriffen werden, die innerhalb des lexikalischen Bereichs in der Sie deklariert ist.So
private
ist restriktiver alsfileprivate
.Als der Swift 4, private-Deklarationen innerhalb einer Art zugänglich sind Erweiterungen des gleichen Typs, wenn die Erweiterung definiert, die in der gleichen Quelle-Datei.
Beispiel (alle in einer Quelldatei):
Den privaten
foo
Methode ist nur im Rahmen derdie
class A { ... }
definition. Es ist auch nicht zugänglicheine Erweiterung des Typs (Swift 3, siehe zweiten Hinweis unten
änderungen im Swift 4).
Den Datei-private
bar
Methode ist zugänglich von der gleichen Quelle-Datei.Hinweise:
Den Vorschlag SE-0159 – Fix Privaten Zugriffsberechtigungen schlug wieder den Swift 2 Semantik im Swift 4. Nach einer langen und kontroversen Diskussion über das swift-evolution-Mailingliste wurde der Vorschlag abgelehnt.
Den Vorschlag SE-0169 – Verbesserung der Interaktion Zwischen private-Deklarationen und-Erweiterungen schlägt, um
private
Deklarationen innerhalb einer Art zugänglich zu Erweiterungen des gleichen Typs
wenn die extension definiert wird, in der gleichen Quelle-Datei.
Dieser Vorschlag wurde angenommen und durchgeführt, Swift 4.
InformationsquelleAutor der Antwort Martin R
Ich nur ein Diagramm zeichnen über privatefileprivateöffnen und öffentlichen
Hoffe, es kann schnell helfen Ihnen , für text Beschreibung entnehmen Sie bitte Martin R 's Antwort
[ Update Swift 4 ]
InformationsquelleAutor der Antwort Stephen Chen
Eine praktische Faustregel ist, dass Sie private für Variablen, Konstanten, inneren Strukturen und Klassen, die verwendet werden, die nur innerhalb der Deklaration der Klasse /struct. Verwenden Sie fileprivate für Dinge, die verwendet werden, im inneren, werden Ihre Erweiterungen innerhalb der gleichen Datei wie Ihre Klasse/struct aber außerhalb Ihrer Definition in geschweiften Klammern (dh. Ihre lexikalischen scope).
InformationsquelleAutor der Antwort Josh Homann
Obwohl @MartinR ' s und @StephenChen Antwort sind perfekt, Swift 4 ändert die Dinge ein wenig.
Private ist jetzt als privat, um eine Klasse in der Sie deklariert ist und auch seine Erweiterungen.
FilePrivate ist als private, die in dieser Datei werden, es eine Klasse, in der die variable definiert ist, wird es Verlängerung, oder jedes andere definierte Klassen in derselben Datei.
InformationsquelleAutor der Antwort Nikita P
Im folgenden Beispiel Sprachkonstrukte geändert von
private
undfileprivate
scheinen gleich Verhalten:Dies ist nach intuition, denke ich. Aber, gibt es eine Ausnahme?
Freundlichen GRÜßEN.
InformationsquelleAutor der Antwort Tomas Balderas
Ich mag das, weil es ist super einfach für ivars.
Versuchen fileprivate zu privat (und Umgekehrt) und schau, was passiert auf kompilieren...
InformationsquelleAutor der Antwort CPD
Swift 4.0, Private ist jetzt zugänglich in der Erweiterung, aber innerhalb der gleichen Datei. Wenn Sie deklarieren/definieren, Erweiterung in einer anderen Datei, dann wird Ihre private-variable wird nicht zugänglich sein, Ihre Erweiterung**
Datei Private
Datei-eigener Zugang schränkt die Nutzung auf ein Unternehmen zu seiner eigenen Definition von Quell-Datei. Verwenden Sie den Datei-privater Zugang zum verstecken die details der Implementierung eines bestimmten Teil der Funktionalität, wenn diese details sind innerhalb einer gesamten Datei.
Syntax:
fileprivate <var type> <variable name>
Beispiel:
fileprivate class SomeFilePrivateClass {}
Private
Privater Zugang schränkt die Verwendung von eine Person, die den umschließenden Erklärung, und Erweiterungen, die Erklärung, die in der gleichen Datei. Verwenden Sie einen privaten Zugang zum verstecken die details der Implementierung eines bestimmten Teil der Funktionalität, wenn Sie diese Angaben werden verwendet, nur in einer einzigen Erklärung.
Syntax:
private <var type> <variable name>
Beispiel:
private class SomePrivateClass {}
Hier ist mehr detail über alle Zugriffsberechtigungen: Swift - Zugriffsebenen
Blick auf diese Bilder:
Datei: ViewController.swift
Erweiterung hier und view-controller-beide sind in der gleichen Datei, also die privaten Variablen
testPrivateAccessLevel
zugänglich ist, in ErweiterungDatei: TestFile.swift
Erweiterung hier und view-controller-beide in verschiedenen Dateien, also die privaten Variablen
testPrivateAccessLevel
nicht zugänglich ist und in der extension.Hier Klasse
ViewController2
ist eine Unterklasse vonViewController
und beide sind in derselben Datei. Hier private variabletestPrivateAccessLevel
ist nicht zugänglich sind, in der Unterklasse, aber fileprivate zugänglich ist, in der Unterklasse.InformationsquelleAutor der Antwort Krunal
filePrivate - access-controll-Ebene ist in der Datei.
Fall 1: Wenn wir die Erweiterung mit in die gleiche Klasse-Datei, und versuchen, auf fileprivate Funktion oder fileprivate Eigenschaft in der Verlängerung - Zugriff erlaubt
Fall 2: Wenn wir eine Erweiterung der Klasse im neue-Datei - Und nun versuchen, auf fileprivate Funktion oder fileprivate property - Zugriff nicht erlaubt
private - access-control-Ebene ist mit im lexikalischen Bereich
Fall 1: Wenn die Eigenschaft oder Funktion als private deklariert in der Klasse - dann Rahmen ist standardmäßig die Klasse.
Fall 2: wenn die private Instanz ist deklariert mit in der Funktion Körper - dann Anwendungsbereich der Instanz beschränkt sich auf die Funktion Körper.
InformationsquelleAutor der Antwort Ashish Chhabra