Czym jest słowo kluczowe "open" w języku Swift?

The ObjectiveC.swift Plik z biblioteki standardowej zawiera kilka następujących linii kodu wokół linii 228:

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

Co oznacza open var w tym kontekście, lub co jest słowem kluczowym open w ogóle?

Author: Martin R, 2016-08-14

5 answers

open jest nowym poziomem dostępu w Swift 3, wprowadzonym wraz z implementacją z

Jest on dostępny z migawką Swift 3 od 7 sierpnia 2016, oraz Xcode 8 beta 6.

W skrócie:

  • klasa open jest dostępna i podklasowalna poza definiowanie modułu. Klasa jest dostępna dla klasy open oraz overridable poza modułem definiującym.
  • a public klasa jest dostępna ale nie podklasowalna poza definiowanie modułu. A public class member is accessible but nie nadpisywalne poza modułem definiującym.

Więc open jest tym, co public było w poprzednim Szybkie wydania i dostęp do public został ograniczony. Lub, Jak to ujął Chris Lattner SE-0177: pozwolić na rozróżnienie pomiędzy publicznymi dostęp i publiczne nadpisywanie :

"otwarty" jest teraz po prostu "bardziej publiczny niż publiczny", zapewniając bardzo prosty i czysty model.

W twoim przykładzie, open var hashValue jest właściwością, która jest dostępna i może być nadpisana w NSObject podklasach.

Aby uzyskać więcej przykładów i szczegółów, spójrz na SE-0117 .

 603
Author: Martin R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-15 03:33:43

Czytaj Otwórz jako

Otwarte dla dziedziczenia w innych modułach

Powtarzam otwarty dla dziedziczenia w innych modułach. Tak więc klasa otwarta jest otwarta do podklasowania w innych modułach, które zawierają moduł definiujący. Otwarte var i funkcje są otwarte do nadpisywania w innych modułach. To najmniej restrykcyjny poziom dostępu. Jest tak dobry jak publiczny dostęp, z wyjątkiem tego, że coś, co jest publiczne, jest zamknięte dla dziedziczenia w innych modułach.

Z Jabłka Docs :

Otwarty dostęp dotyczy tylko klas i członków klasy i różni się od publicznego dostępu następująco:

  1. Klasy z publicznym dostępem, lub innym bardziej restrykcyjnym poziomem dostępu, mogą być podklasowane tylko w module, w którym są zdefiniowane.

  2. Członkowie klasy z publicznym dostępem, lub innym bardziej restrykcyjnym poziomem dostępu, mogą być nadpisywane przez podklasy tylko w module, gdzie są zdefiniowany.

  3. Zajęcia otwarte mogą być podklasowane w module, w którym są zdefiniowane, oraz w dowolnym module, który importuje moduł, w którym są zdefiniowane.

  4. Członkowie klasy otwartej mogą być nadpisywani przez podklasy w module, w którym są zdefiniowane, oraz w dowolnym module, który importuje moduł, w którym są zdefiniowane.

 15
Author: Mohammad Sadiq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-08 11:52:51

Open jest poziomem dostępu, został wprowadzony w celu nałożenia ograniczeń dziedziczenia klas na Swift.

Oznacza to, że otwarty Poziom dostępu może być stosowany tylko do klas i członków klas .

W Klasach

Klasa otwarta może być podklasowana w module, w którym jest zdefiniowana, oraz w modułach, które importują moduł, w którym jest zdefiniowana Klasa.

In Class members

To samo dotyczy członków klasy. Metoda Otwarta może być nadpisane przez podklasy w module jest zdefiniowany w i w modułach, które importują moduł, w którym metoda jest zdefiniowana.

POTRZEBA TEJ AKTUALIZACJI

Niektóre klasy bibliotek i frameworków nie są zaprojektowane do podklasowania i może to spowodować nieoczekiwane zachowanie. Natywna Biblioteka Apple nie pozwala również na nadpisywanie tych samych metod i klas,

Więc po tym dodaniu będą stosować poziomy dostępu publicznego i prywatnego odpowiednio.

Aby uzyskać więcej informacji, zapoznaj się z dokumentacją Apple dotyczącą kontroli dostępu

 6
Author: Saranjith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-03 16:32:34

Otwórz się, aby grać, gdy masz do czynienia z wieloma modułami.

Klasa otwarta jest dostępna i podklasowalna poza modułem definiującym. Członek klasy otwartej jest dostępny i nadpisywalny poza modułem definiującym.

 1
Author: Rajasekaran Gopal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-24 06:32:01

Open jest tylko dla innego modułu, na przykład: Cocoa pods, lub unit test, możemy dziedziczyć lub nadpisywać

 0
Author: William,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-18 23:54:28