it-swarm.com.de

Was ist das "offene" Keyword in Swift?

Die Datei ObjectiveC.Swift aus der Standardbibliothek enthält die folgenden Codezeilen in Zeile 228:

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

Was bedeutet open var in diesem Zusammenhang oder was ist das open-Schlüsselwort im Allgemeinen?

282
Clashsoft

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

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

Zusamenfassend:

  • Eine open-Klasse ist erreichbar und subclassable außerhalb des Definitionsmoduls. Ein open-Klassenmitglied ist zugänglich und overridable außerhalb des definierenden Moduls.
  • Eine public-Klasse ist erreichbar, aber ist nicht subklassifizierbar außerhalb des Definitionsmoduls. Ein public-Klassenmitglied ist zugänglich, aber nicht überschreibbar außerhalb des definierenden Moduls.

open ist also das, was public in früheren Swift-Releases war, und der Zugriff auf public wurde eingeschränkt .__ Oder, wie Chris Lattner es in SE-0177 schreibt: Erlaube die Unterscheidung zwischen öffentlichem Zugriff und öffentliche Überschreitbarkeit :

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

In Ihrem Beispiel ist open var hashValue eine Eigenschaft, auf die zugegriffen werden kann und die in NSObject-Unterklassen überschrieben werden kann.

Weitere Beispiele und Details finden Sie unter SE-0117 .

496
Martin R

Lesen Sie offen als 

offen für die Vererbung in anderen Modulen

Ich wiederhole offen für die Vererbung in anderen Modulen. Daher ist eine offene Klasse für Unterklassen in anderen Modulen, die das definierende Modul enthalten, geöffnet. Offene Variablen und Funktionen sind zum Überschreiben in anderen Modulen geöffnet. Es ist die am wenigsten restriktive Zugriffsebene. Es ist so gut, wie der öffentliche Zugriff akzeptiert, dass etwas Öffentliches für die Vererbung in anderen Modulen gesperrt ist. 

Von Apple Docs :

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

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

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

  3. Offene Klassen können innerhalb des Moduls, in dem sie definiert sind, und innerhalb eines Moduls, in das das Modul importiert wird, untergeordnet werden. Sie sind definiert. 

  4. Offene Klassenmitglieder können von Unterklassen überschrieben werden innerhalb des Moduls, wo sie definiert sind, und innerhalb eines Moduls, das importiert das Modul dort, wo sie definiert sind.
7
Mohammad Sadiq

Open ist eine Zugriffsebene, mit der Einschränkungen bei der Klassenvererbung von Swift eingeführt wurden. 

Dies bedeutet, dass die Zugriffsebene open nur auf Klassen und Klassenmitglieder angewendet werden kann.

In Klassen

Eine offene Klasse kann in dem Modul, in dem es definiert ist, und in Modulen, die das Modul importieren, in dem die Klasse definiert ist, Unterklassen sein.

In Klassenmitgliedern

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

Die Notwendigkeit für dieses Update

Einige Klassen von Bibliotheken und Frameworks sind nicht für Unterklassen konzipiert und können zu unerwartetem Verhalten führen. Die native Apple-Bibliothek erlaubt es nicht, dieselben Methoden und Klassen zu überschreiben. 

Nach diesem Zusatz wenden sie also die öffentlichen und privaten Zugriffsebenen entsprechend an.

Weitere Informationen finden Sie unter Apple-Dokumentation zur Zugriffskontrolle

4
Saranjith

open ist beispielsweise nur für ein anderes Modul: Kakaopods oder Unit-Test, den wir erben oder überschreiben können 

0
William

open come to play beim Umgang mit mehreren Modulen.

die offene Klasse ist außerhalb des Definitionsmoduls zugänglich und Unterklasse. Ein offenes Klassenmitglied ist außerhalb des definierenden Moduls zugänglich und überschreibbar.

0

Mit Ausnahme der Unterklasse ist ein open class func auch 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")
    }
}

Dann können Sie von jedem beliebigen View Controller aus auf diese Methode zugreifen, indem Sie sie aufrufen

Utils.printHello()
0
Fangming