Tut Swift zugriffsmodifizierer?
In Objective-C Beispiel-Daten können public
, protected
oder private
. Zum Beispiel:
@interface Foo : NSObject
{
@public
int x;
@protected:
int y;
@private:
int z;
}
-(int) apple;
-(int) pear;
-(int) banana;
@end
Habe ich nicht gefunden, erwähnt zugriffsmodifizierer in der Swift-Referenz. Ist es möglich, begrenzen Sie die Sichtbarkeit der Daten im Swift?
Ich auch nicht. Apple sollte sich zumindest vorzustellen und Etikette für privates, wie in python werden Sie mit vorangestelltem Unterstrich.
Hinzugefügt eine Antwort aktualisiert die Finale version von Xcode 6.1.1
Swift 4 aktualisierte Antwort.
Hinzugefügt eine Antwort aktualisiert die Finale version von Xcode 6.1.1
Swift 4 aktualisierte Antwort.
InformationsquelleAutor Gergo Erdosi | 2014-06-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Von Swift 3.0.1 gibt es " 4-Ebenen-Zugang, wie unten beschrieben, von der die höchste (am wenigsten restriktiv) zu den niedrigsten (strengsten).
1.
open
undpublic
Aktivieren einer Entität verwendet werden, die außerhalb des definierenden Moduls (Ziel). Verwenden Sie in der Regel
open
oderpublic
zugreifen, wenn Sie die öffentliche Schnittstelle zu einem framework.Jedoch
open
Zugang gilt nur für Klassen und Schüler, und es unterscheidet sich vonpublic
Zugang wie folgt:public
Klassen und Klassenmember können nur Unterklassen und überschrieben wird innerhalb der Definition-Modul (target).open
Klassen und Klassenmember können als Unterklasse definiert und überschrieben, sowohl innerhalb als auch außerhalb des definierenden Moduls (Ziel).2.
internal
Ermöglicht es, eine Einheit zu sein innerhalb der Definition-Modul (target). Verwenden Sie in der Regel
internal
Zugang bei der Definition einer app oder einem framework ' s interner Struktur.3.
fileprivate
Schränkt die Verwendung von einer Entität zu seiner Definition von Quell-Datei. Verwenden Sie in der Regel
fileprivate
Zugang zu verstecken die details der Implementierung eines bestimmten Teil der Funktionalität, wenn diese details sind innerhalb einer gesamten Datei.4.
private
Schränkt die Verwendung von einer Entität zu seiner umschließenden Erklärung. Verwenden Sie in der Regel
private
Zugang zu verstecken die details der Implementierung eines bestimmten Teil der Funktionalität, wenn Sie diese Angaben werden verwendet, nur in einer einzigen Erklärung.Es immer einige Methoden oder Variablen in OOP (objektorientierte Programmierung), privat oder geschützt. Dies ermöglicht eine Implementierung von robustes design, wie groß die Methoden sind unterteilt, um eine Anzahl von kleineren, jeder mit seiner eigenen Verantwortung, dass die überschrieben werden können, sondern nur das "main" - Methode sollte sein verfügbar für die öffentliche Nutzung.
Ich persönlich mag es nicht Lösungen wie die mit dem Unterstrich/special-char führenden "private" - Methoden. Auch wenn es garantiert ist, dass ich für mich die einzige person, die jemals einen Blick auf diesen code, es macht den code speichern mehr / weniger anfällig für Fehler dazu führen, dass der compiler einfach verhindern, dass Sie tun Dinge, die Sie nicht tun sollten. Also ich denke man sollte die "access-control-Mechanismen" so schnell wie möglich, damit die Leute nicht bekommen verwendet, um schlechte Gewohnheiten.
Die Xcode 6 beta release notes sagen: "Zugriffssteuerung (öffentlich/privat Mitglieder) ist nicht aktiviert in diesem Samen. (15747445)"
Die Idee, eine öffentliche Schnittstelle, die ist sehr wertvoll. Wenn Sie wollen, dass jeder code in der Klasse muss sich innerhalb von Funktionen, die Teil der öffentlichen API, ich denke, das ist ziemlich begrenzt. Auf der anderen Seite, der eine bestimmte öffentliche API erlaubt die Implementierung zu ändern (einschließlich der Nutzung von private-Methoden) ohne Unterbrechung der Verbraucher. Wenn jemand "Bedarf" zu nutzen, eine interne Klasse Methode, die ich fühlen Sie sind Missverständnis, die Grenzen der Klasse' Funktionen (oder versuchen, eine buggy-Klasse).
InformationsquelleAutor akashivskyy
Swift 4
Als pro erwähnt in der Swift-Dokumentation - Access-Control, Swift 4 hat 5 Zugriffskontrollen:
öffnen und öffentlichen: der Zugriff ist von Ihrem Modul ' Personen und alle module, die Entitäten, die Importe der Definition Modul.
internen: kann nur zugegriffen werden, aus deren Modul Entitäten. Es ist die Standard-Zugriffsebene.
fileprivate und private: kann nur zugegriffen werden, in beschränkt, die in einem begrenzten Gültigkeitsbereich, in dem Sie Sie definieren.
Was ist der Unterschied zwischen open und public?
öffnen ist die gleiche wie die öffentliche, die in früheren Versionen von Swift, Sie erlauben es, Klassen aus anderen Modulen zu verwenden und zu Erben, Sie, ich.e: Sie können Unterklassen aus anderen Modulen. Auch Sie erlauben es, Elemente aus anderen Modulen zu verwenden und diese überschreiben. Die gleiche Logik gilt für Ihre Module.
öffentlichen ermöglichen Klassen aus anderen Modulen zu verwenden, aber nicht Erben Sie, ich.e: Sie nicht werden Unterklassen von anderen Modulen. Auch Sie erlauben es, Elemente aus anderen Modulen zu verwenden, aber NICHT, Sie zu überschreiben. Für Ihre Module, haben Sie die gleichen open-Logik (Sie erlauben es, Klassen zu verwenden, und Erben; Sie erlauben, Mitglieder zu verwenden und diese überschreiben).
Was ist der Unterschied zwischen fileprivate und privat?
fileprivate zugegriffen werden kann, aus der Sie Ihre gesamten Dateien.
private kann nur zugegriffen werden, von Ihrer einzigen Erklärung zu Erweiterungen dieser Erklärung ist, dass in der gleichen Datei; Zum Beispiel:
Was sind die Unterschiede zwischen Swift 3 Swift 4 Access Control?
Wie gesagt in den SE-0169 Vorschlag, der nur die Verfeinerung Hinzugefügt wurde Swift 4 ist, dass die private access-control-Anwendungsbereich wurde erweitert, um Zugriff auf Erweiterungen der Deklaration in der gleichen Datei; Zum Beispiel:
So, es gibt keine Notwendigkeit zu erklären
myMessage
als fileprivate zugänglich sein, die gesamte Datei.Sidebar Hinweis: Wenn Sie konfrontiert Probleme im Zusammenhang nicht kompilieren Swift 4 mit migriert älteren Swift 3-Projekt, Sie könnte prüfen,dieses Q&A.
InformationsquelleAutor Ahmad F
Wenn man spricht über eine "private Methode" in Swift oder ObjC (oder ruby oder java oder...) diese Methoden sind nicht wirklich private. Es gibt keinen wirklichen Zugang Kontrolle um Sie herum. Jede Sprache, bietet sogar ein wenig Introspektion ermöglicht Entwicklern auf diese Werte außerhalb der Klasse, wenn Sie wirklich wollen.
Also, was wir wirklich reden hier ist eine Möglichkeit zur Definition einer öffentlichen Schnittstelle, die lediglich präsentiert die Funktionalität, die wir wollen, und "versteckt" die Ruhe, die wir als "privat".
Den Swift-Mechanismus für die Deklaration von Schnittstellen ist die
protocol
, und es kann für diesen Zweck verwendet werden.Denken Sie daran, die Protokolle sind erste-Klasse-Typen und kann verwendet werden, überall eine geben kann. Und, wenn verwendet, dieser Weg, Sie enthüllen nur Ihre eigenen interfaces, nicht die der Umsetzung geben.
So, so lange wie Sie
MyClass
stattMyClassImplementation
in Ihrer parameter-Typen, etc. es sollte alles einfach funktionieren:Gibt es einige Fälle von der direkten Zuordnung, wo Sie explizit mit Typ-anstatt sich auf Swift zu erschließen, aber das scheint kaum ein deal breaker:
Unter Verwendung von Protokollen auf diese Weise semantisch, halbwegs übersichtlich, und für meine Augen sieht viel wie die Klasse Extentions wir haben mit für diesen Zweck in ObjC.
Ich verstehe nicht, was du meinst. Das folgende erstellt eine öffentliche Methode mit einem optionalen parameter. Es scheint nicht zu einem problem werden: gist.github.com/anonymous/17d8d2d25a78644046b6
Aus irgendeinem Grund ist der optionale parameter nicht funktioniert, wie es sollte auf meinem Projekt, hatte bereits versucht etwas ähnliches zu deinem GitHub-Beispiel. Wir können nicht die Standard-parameter in einem Protokoll, ich blieb stecken und landete eine Frage stellen. Vielen Dank für den Versuch zu helfen.
Wir alle wissen, dass alles, was ist hackable. Wir brauchen nur etwas um, was, warum brauchen wir Zugang Modifikatoren
InformationsquelleAutor jemmons
Soweit ich das beurteilen kann, gibt es kein Schlüsselwort 'public', 'private' oder 'protected'. Dies würde vorschlagen, alles, was öffentlich ist.
Aber Apple kann damit rechnen, dass Menschen zu verwenden "Protokolle" (sogenannte Schnittstellen mit dem rest der Welt) und die factory design pattern zu verbergen details der Implementierung geben.
Dies ist oft eine gute design-pattern zu verwenden, sowieso; wie können Sie ändern Ihre Umsetzung Klassenhierarchie, während die logische Typ-system die gleichen.
Das würde besser funktionieren, wenn es war ein Weg zu verbergen die Implementierung der Klasse des Protokolls, aber es scheint nicht zu sein.
Kann jemand bieten ein anschauliches Beispiel für dieses Muster?
Gut, diese Antwort gültig war, in der bisherigen Swift-version(en), es scheint, dass es nicht mehr gültig 🙂 überprüfen Sie bitte meine Antwort.
InformationsquelleAutor Ian Ringrose
Unter Verwendung einer Kombination von Protokollen, Verschlüsse und verschachtelte/innere Klassen, ist es möglich, etwas entlang der Linien von " das Modul-Muster zu verstecken Informationen in Swift jetzt. Es ist nicht super sauber oder schön zu Lesen, aber es funktioniert.
Beispiel:
innerVal und mysteriousMath sind hier versteckt, die von außerhalb nutzen und versuchen zu Graben Sie Ihren Weg in das Objekt sollte zu einem Fehler führen.
Ich bin nur Teil des Weges durch meine Lektüre des Swift-docs so, wenn es ein Fehler hier bitte zeigen Sie es aus, würde es gerne wissen.
Swift ist eine Typ-sichere und das einzige, was die äußere Welt weiß von h ist, erfüllt es HuhThing. HuhThing enthält keine Informationen über eine Eigenschaft namens innerVal und so versuchen, darauf zuzugreifen, ist ein Fehler.
Immer noch zugänglich 😛
reflect(h)[0].1.value // 19
Schön finden es John - ich war nicht bewusst zu reflektieren. Scheint zu drehen Objekte in Tupeln - gibt es eine offizielle Dokumentation, die Funktion oder andere metaprogramming Sachen in Swift? Ich warf einen Blick über die language-guide auf iBooks, aber ich bin nicht es zu sehen.
Ich glaube nicht, dass die Reflexion zählt. In Java (eine reifere Sprache), es zugriffsmodifizierer, aber Sie nicht verhindern, dass die Reflexion tricks.
InformationsquelleAutor Dave Kapp
Als der Xcode 6 beta 4, Swift hat zugriffsmodifizierer. Aus den release notes:
Den impliziten Standardwert ist
internal
, also innerhalb einer Anwendung, die Ziel-lassen Sie zugriffsmodifizierer aus-außer dort, wo Sie sein wollen, mehr restriktiv. Im Rahmen der Ziel (z.B. wenn Sie die Einbettung eines Rahmens zu teilen code zwischen einer app und einer sharing-oder "Heute" - Ansicht-Erweiterung), verwenden Siepublic
zu benennen, die API, die Sie verfügbar machen möchten, um Kunden von Ihren Rahmen.InformationsquelleAutor rickster
Swift 3.0 bietet fünf verschiedene Zugangs-Kontrollen:
Standard-Zugriffsebenen
Alle Personen, die in Ihrem code (mit einigen spezifischen Ausnahmen) haben eine Standard-access-level der internen wenn Sie nicht geben Sie eine explizite Zugriffsberechtigung selbst. Als ein Ergebnis, in vielen Fällen brauchen Sie nicht zu geben Sie eine explizite Zugriffsberechtigung in Ihrem code.
Die release-note zu dem Thema:
Mehr Informationen & details :
Die Swift-Programmiersprache (Access Control)
InformationsquelleAutor CryingHippo
In der Beta 6, die Dokumentation besagt, dass es drei unterschiedliche zugriffsmodifizierer:
Und diese drei für Klassen, Protokolle, Funktionen und Eigenschaften.
Weitere, überprüfen Access Control.
Gut, diese Antwort gültig war, in der bisherigen Swift-version(en), es scheint, dass es nicht mehr gültig 🙂 überprüfen Sie bitte meine Antwort.
InformationsquelleAutor OliverAssad
Access control-Mechanismen als eingeführt in Xcode 6:
Standard accecss es internen, und hat als solche nicht angegeben werden müssen. Beachten Sie auch, dass die private Planer hat nicht Arbeit auf Klassenebene, sondern auf der source-Datei-Ebene. Dies bedeutet, dass man Teile einer Klasse wirklich privaten müssen Sie getrennt in eine Datei. Dies führt auch einige interessante Fälle mit Bezug auf unit-Tests...
Ein weiterer Punkt, der mich gemacht, der kommentiert in den link oben, ist, dass Sie können nicht 'upgrade' auf der access-Ebene. Wenn Sie eine Unterklasse etwas eingeschränkt wurde, können Sie es mehr, aber nicht die andere Weise herum.
Dieser Letzte bit betrifft auch Funktionen, Tupel und sicher noch andere Sachen in der Weise, dass, wenn also eine Funktion verwendet eine private Klasse, dann ist es nicht gültig, um die Funktion internen oder öffentlichen, da Sie möglicherweise nicht über Zugriff auf die private Klasse. Dies führt zu einer compiler-Warnung, und Sie müssen deklarieren Sie die Funktion als private Funktion.
InformationsquelleAutor holroy
Für Swift 1-3:
Nein, es ist nicht möglich. Es gibt keine private/protected Methoden und Variablen in allen.
Ist alles öffentlich.
Update
Da Swift 4 ist es möglich, siehe die anderen Antworten in diesem thread
Dieser Kommentar ist genau für die aktuelle Saatgut.
Das sind schlechte Nachrichten. 🙁
Für die aktuelle Saatgut. Es wird in der Zukunft erscheinen.
"public" / "protected" / "private" existieren derzeit nicht, aber Sie können ausblenden, Dinge mit Verschlüssen, Protokolle und innere Klassen - das macht es etwas wie das Modul-pattern in JavaScript Häufig. Bitte siehe mein Beispielcode auf meine Antwort hier für ein Beispiel, wie dies zu tun. Wenn ich mich Irre darüber, wie es funktioniert und mein Beispiel ist falsch, bitte hinweisen, wie ich bin immer noch zu lernen. 🙂
InformationsquelleAutor Sam
Einer der Optionen, die Sie nutzen könnten ist, um wickeln Sie die Instanz der Schöpfung in eine Funktion, und geben Sie die entsprechenden Getter und setter im Konstruktor:
InformationsquelleAutor Bartosz Ciechanowski
Jetzt in der beta 4, die Sie Hinzugefügt haben, Zugriff Modifikatoren zu Swift.
vom Xcode 6 beta 4 realese notes:
Gut, diese Antwort gültig war, in der bisherigen Swift-version(en), es scheint, dass es nicht mehr gültig 🙂 überprüfen Sie bitte meine Antwort.
InformationsquelleAutor Alexey Globchastyy
Swift 3 und 4 brachte eine Menge Veränderungen auch für die Zugriffsebenen von Variablen und Methoden. Swift 3 und 4 hat nun 4 verschiedene Zugriffsebenen, wo öffentlichen Zugriff ist die höchste (am wenigsten restriktiv) Zugang Ebene und private Zugriff auf die niedrigsten (strengsten) access level:
Interessant:
Statt der Kennzeichnung jeder einzelnen Methode oder Element als "privat", können Sie decken einige Methoden (z.B. in der Regel Hilfsfunktionen) in einer Erweiterung einer Klasse /Struktur und markieren Sie die ganze Erweiterung als "Privat".
Dies kann eine gute Idee sein, um zu besser wartbaren code. Und man kann leicht wechseln (z.B. für unit-Tests) auf nicht-private, einfach indem ein Wort.
Apple-Dokumentation
aktualisiert für Swift 4: Danke @Ahmad F
InformationsquelleAutor LukeSideWalker
Den Sprache Grammatik nicht über die keywords 'public', 'private' oder 'protected'. Dies würde vorschlagen, alles, was öffentlich ist. Natürlich könnte es einige alternative Methode, anzugeben, zugriffsmodifizierer, ohne diese keywords aber ich konnte ihn nicht finden in der language reference.
InformationsquelleAutor Scroog1
Hoffentlich um etwas Zeit zu sparen, für diejenigen, die wollen so etwas wie geschützte Methoden:
Als pro anderen Antworten, swift jetzt bietet die "private" - modifier - definierte Datei-Weise statt-Klasse-Weise wie diejenigen, die in Java oder C# beispielsweise. Dies bedeutet, dass, wenn Sie wollen, geschützten Methoden, die Sie tun können, es mit swift private Methoden , wenn Sie in der gleichen Datei
z.B. Datei 1:
Datei 2:
}
InformationsquelleAutor james_alvarez
https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AccessControl.html#//apple_ref/doc/uid/TP40014097-CH41-ID3
STARTEN SWIFT 2.2 😉
Standardmäßig Interne
InformationsquelleAutor OliverAssad
bis swift 2.0 gab es nur drei access level [Public, internal, private]
aber in swift 3.0 apple hat zwei neue access-Ebene, die [ Öffnen, Dateityp ] so
jetzt in swift 3.0 gibt es 5 Zugriff Ebene
Ich möchte hier klar die Rolle, die diese zwei access-Ebene
1. Offen: dies ist ähnlich zu Öffentlich, aber der einzige Unterschied ist, dass der Öffentliche
Zugriff auf die Unterklasse und überschreiben, und Open-access-Ebene kann nicht zugreifen, dieses Bild stammt aus Mittel-website und diese beschreiben Sie den Unterschied zwischen offenen und öffentlichen Zugriff
Nun zum zweiten neuen Zugang Ebene
2. filetype ist die größere version von privater oder weniger access-Ebene als interne
Der Dateityp kann auf die erweiterten Teil der [Klasse, struct, enum]
und private kann nicht auf die erweiterten Teil der code kann jedoch nur auf die
lexikalische scope
dieses Bild stammt aus Mittel-website und diese beschreiben den Unterschied zwischen Dateityp und Privaten Zugang Ebene
InformationsquelleAutor Dilip Tilonia