Was ist das Schlüsselwort "open" in Swift?

333

Die ObjectiveC.swiftDatei aus der Standardbibliothek enthält die folgenden Codezeilen um Zeile 228:

extension NSObject : Equatable, Hashable {
  /// ...
  open var hashValue: Int {
    return hash
  }
}

Was open varbedeutet in diesem Zusammenhang oder was ist das openSchlüsselwort im Allgemeinen?

Clashsoft
quelle
2
Möglicherweise verwandt: stackoverflow.com/questions/24003918/… ("Was ist der Unterschied zwischen openund public?")
Ahmad F
Randnotiz: Schlüsselwort "offen" stammt aus dem Konzept "offen für Erweiterung, geschlossen für Modifikation"
Sazzad Hissain Khan

Antworten:

571

open ist eine neue Zugriffsebene in Swift 3, die mit der Implementierung von eingeführt wurde

Es ist mit dem Swift 3-Snapshot vom 7. August 2016 und mit Xcode 8 Beta 6 verfügbar.

Zusamenfassend:

  • Eine openKlasse ist außerhalb des definierenden Moduls zugänglich und unterklassifizierbar . Ein openKlassenmitglied ist außerhalb des definierenden Moduls zugänglich und überschreibbar .
  • Eine publicKlasse ist außerhalb des definierenden Moduls zugänglich, aber nicht unterklassifizierbar . Ein publicKlassenmitglied ist außerhalb des definierenden Moduls zugänglich, aber nicht überschreibbar .

So war openes publicauch in früheren Swift-Versionen, und der Zugriff auf publicwurde eingeschränkt. Oder, wie Chris Lattner es in SE-0177 formuliert: Ermöglichen Sie die Unterscheidung zwischen öffentlichem Zugang und öffentlicher Überschreibbarkeit :

"Offen" ist jetzt einfach "öffentlicher als öffentlich" und bietet ein sehr einfaches und sauberes Modell.

In Ihrem Beispiel open var hashValuehandelt es sich um eine Eigenschaft, auf die zugegriffen werden kann und die in NSObjectUnterklassen überschrieben werden kann .

Weitere Beispiele und Details finden Sie unter SE-0117 .

Martin R.
quelle
16
Also publicin Swift 3 ist wie public finalin Swift 2 und openist wie public?
Clashsoft
16
@Clashsoft: "open" in Swift 3 ist wie "public" in Swift 2. "public" in Swift 3 hat in Swift 2 kein Äquivalent. (Eine letzte Klasse kann überhaupt nicht in Unterklassen unterteilt werden, auch nicht im selben Modul.)
Martin R
59
Das ist unglaublich eingängig. Danke für die Zusammenfassung.
GoldenJoe
7
Stimmen Sie mit @MikeS überein, und die mangelnde Abwärtskompatibilität macht dies zu einem schrecklichen Durcheinander.
HughHughTeotl
14
@ MikeS Apfel - anders denken, auch wenn es unnötig ist.
Varun Nath
12

Lesen Sie offen als

offen für die Vererbung in anderen Modulen

Ich wiederhole offen für die Vererbung in anderen Modulen. Eine offene Klasse ist also offen für Unterklassen in anderen Modulen, die das definierende Modul enthalten. Offene Variablen und Funktionen können in anderen Modulen überschrieben werden. Es ist die am wenigsten restriktive Zugriffsebene. Es ist so gut wie der öffentliche Zugang zu akzeptieren, dass etwas, das öffentlich ist, für die Vererbung in anderen Modulen geschlossen ist.

Aus Apple Docs :

Open Access gilt nur für Klassen und Klassenmitglieder und unterscheidet sich vom öffentlichen Zugriff wie folgt:

  1. Klassen mit öffentlichem Zugriff oder einer restriktiveren Zugriffsebene können nur innerhalb des Moduls, in dem sie definiert sind, in Unterklassen unterteilt werden.

  2. Klassenmitglieder mit öffentlichem Zugriff oder einer restriktiveren Zugriffsebene können nur innerhalb des Moduls, in dem sie definiert sind, von Unterklassen überschrieben werden.

  3. Offene Klassen können innerhalb des Moduls, in dem sie definiert sind, und in jedem Modul, das das Modul importiert, in dem sie definiert sind, in Unterklassen unterteilt werden.

  4. Offene Klassenmitglieder können von Unterklassen innerhalb des Moduls, in dem sie definiert sind, und in jedem Modul, das das Modul importiert, in dem sie definiert sind, überschrieben werden.
Mohammad Sadiq
quelle
5

Open ist eine Zugriffsebene, die eingeführt wurde, um Swift die Klassenvererbung einzuschränken.

Dies bedeutet, dass die Open Access-Ebene nur auf Klassen und Klassenmitglieder angewendet werden kann .

In Klassen

Eine offene Klasse kann in dem Modul, in dem sie definiert ist, und in Modulen, die das Modul importieren, in dem die Klasse definiert ist, in Unterklassen unterteilt werden.

In Klassenmitgliedern

Gleiches gilt für Klassenmitglieder. Eine offene Methode kann durch Unterklassen in dem Modul, in dem sie definiert ist, und in Modulen, die das Modul importieren, in dem die Methode definiert ist, überschrieben werden.

DIE NOTWENDIGKEIT FÜR DIESES UPDATE

Einige Klassen von Bibliotheken und Frameworks sind nicht für die Unterklasse ausgelegt. Dies kann zu unerwartetem Verhalten führen. In der nativen Apple-Bibliothek können dieselben Methoden und Klassen auch nicht überschrieben werden.

Nach dieser Hinzufügung wenden sie die öffentlichen und privaten Zugriffsebenen entsprechend an.

Weitere Informationen finden Sie in der Apple-Dokumentation zur Zugriffssteuerung

Saranjith
quelle
1

Mit Ausnahme der Unterklasse ist eine open class funcauch von überall in Ihrem Projekt zugänglich. Angenommen, Sie definieren eine offene Klassenfunktion in Ihrer Util-Klasse wie folgt

open class Utils: NSObject {
    open class func printHello() {
        print("Hello from utils")
    }
}

In jedem Ihrer View Controller können Sie dann einfach durch Aufrufen auf diese Methode zugreifen

Utils.printHello()
Fangming
quelle
3
Diese Antwort erklärt nicht, wie es sich von der Öffentlichkeit unterscheidet, da Sie dies auch mit der Öffentlichkeit tun können.
Jose Ramirez
Benötigen Sie weitere Erklärungen dazu
MD Aslam Ansari
1

open come to play beim Umgang mit mehreren Modulen.

Die offene Klasse ist außerhalb des definierenden Moduls zugänglich und unterklassifizierbar. Ein offenes Klassenmitglied ist außerhalb des definierenden Moduls zugänglich und überschreibbar.

Rajasekaran Gopal
quelle
0

Öffnen ist nur für ein anderes Modul, zum Beispiel: Kakaofrüchte oder Unit-Test, den wir erben oder überschreiben können

Wilhelm
quelle