Co to jest słowo kluczowe „otwarte” w Swift?

334

ObjectiveC.swiftPlik z biblioteki standardowej zawiera następujące kilka linijek kodu wokół linii 228:

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

Co open varoznacza w tym kontekście lub jakie jest openogólnie słowo kluczowe?

Clashsoft
źródło
2
Możliwe powiązanie: stackoverflow.com/questions/24003918/... („Jaka jest różnica między openi public?”)
Ahmad F
Uwaga dodatkowa: słowo kluczowe „otwarty” pochodzi od pojęcia „otwarty na rozszerzenie, zamknięty na modyfikację”
Sazzad Hissain Khan

Odpowiedzi:

572

open to nowy poziom dostępu w Swift 3, wprowadzony wraz z implementacją

Jest dostępny z migawką Swift 3 od 7 sierpnia 2016 r. Oraz z Xcode 8 beta 6.

W skrócie:

  • openKlasa jest dostępny i subclassable zewnątrz modułu definiującego. Członek openklasy jest dostępny i można go zastąpić poza modułem definiującym.
  • publicKlasa jest dostępny , ale nie subclassable zewnątrz modułu definiującego. Członek publicklasy jest dostępny, ale nie można go zastąpić poza modułem definiującym.

Więc opento, co publickiedyś w poprzednich wersjach SWIFT i dostęp publiczostał ograniczony. Lub, jak ujął to Chris Lattner w SE-0177: Zezwól na rozróżnienie między publicznym dostępem a publicznym nadpisywaniem :

„Otwarty” jest teraz po prostu „bardziej publiczny niż publiczny”, zapewniając bardzo prosty i czysty model.

W twoim przykładzie open var hashValuejest właściwość, która jest dostępna i którą można zastąpić w NSObjectpodklasach.

Więcej przykładów i szczegółów znajduje się na SE-0117 .

Martin R.
źródło
16
Więc publicw Swift 3 jest jak public finalw Swift 2 i openjest jak public?
Clashsoft,
16
@Clashsoft: „otwarte” w Swift 3 jest jak „publiczne” w Swift 2. „publiczne” w Swift 3 nie ma odpowiednika w Swift 2. (Ostatecznej klasy nie można w ogóle podklasować, nawet w tym samym module.)
Martin R
59
To jest przezabawnie sprzeczne z intuicją. Dziękuję za podsumowanie.
GoldenJoe
7
Zgadzam się z @MikeS, a brak kompatybilności wstecznej czyni ten okropny bałagan.
HughHughTeotl
14
@MikeS apple - myśl inaczej, nawet jeśli jest to niepotrzebne.
Varun Nath,
12

Czytaj otwarte jako

otwarte na dziedziczenie w innych modułach

Powtarzam otwarte dla dziedziczenia w innych modułach. Tak więc otwarta klasa jest otwarta do podklasowania w innych modułach, które zawierają moduł definiujący. Otwarte zmienne i funkcje są otwarte do zastąpienia w innych modułach. Jest to najmniej restrykcyjny poziom dostępu. Jest to tak dobre, jak publiczny dostęp akceptuje, że coś, co jest publiczne, jest zamknięte dla dziedziczenia w innych modułach.

Z Apple Docs :

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

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

  2. Członkowie klasy z dostępem publicznym lub dowolnym bardziej ograniczonym poziomem dostępu mogą być zastępowane przez podklasy tylko w module, w którym są zdefiniowane.

  3. Klasy otwarte można podklasować w module, w którym są zdefiniowane, oraz w dowolnym module, który importuje moduł w miejscu, w którym został zdefiniowany.

  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ł tam, gdzie są zdefiniowane.
Mohammad Sadiq
źródło
5

Open to poziom dostępu, wprowadzony w celu nałożenia ograniczeń na dziedziczenie klas w Swift.

Oznacza to, że poziom otwartego dostępu można zastosować tylko do klas i członków klasy .

W klasach

Klasę otwartą można podklasować w module, w którym jest ona zdefiniowana, oraz w modułach, które importują moduł, w którym klasa jest zdefiniowana.

Członkowie klasy

To samo dotyczy członków klasy. Metodę otwartą można zastąpić podklasami w module, w którym jest zdefiniowana, oraz 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 również nie pozwala na przesłonięcie tych samych metod i klas,

Dlatego po dodaniu stosują odpowiednio poziomy dostępu publicznego i prywatnego.

Więcej informacji można znaleźć w dokumentacji Apple na temat kontroli dostępu

Saranjith
źródło
1

Z wyjątkiem podklasy, open class funcjest również dostępna z dowolnego miejsca w projekcie. Załóżmy, że definiujesz funkcję klasy otwartej w swojej klasie Util w ten sposób

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

Następnie w dowolnym miejscu kontrolerów widoku możesz po prostu uzyskać dostęp do tej metody, dzwoniąc

Utils.printHello()
Fangming
źródło
3
Ta odpowiedź nie wyjaśnia, czym różni się od publicznego, ponieważ możesz to zrobić również publicznie.
Jose Ramirez
Potrzebujesz więcej wyjaśnień na ten temat
MD Aslam Ansari,
1

open come to play, gdy masz do czynienia z wieloma modułami.

klasa otwarta jest dostępna i można ją podklasować poza modułem definiującym. Członek klasy otwartej jest dostępny i można go zastąpić poza modułem definiującym.

Rajasekaran Gopal
źródło
0

open jest tylko dla innego modułu, na przykład: strąki kakaowe lub test jednostkowy, możemy odziedziczyć lub zastąpić

William
źródło