Qual è la parola chiave "aperta" in Swift?


334

Il ObjectiveC.swiftfile dalla libreria standard contiene le seguenti poche righe di codice attorno alla riga 228:

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

Cosa open varsignifica in questo contesto o qual è la openparola chiave in generale?


2
Possibilmente correlato: stackoverflow.com/questions/24003918/… ("Qual è la differenza tra opene public?")
Ahmad F

Nota a
margine

Risposte:


572

open è un nuovo livello di accesso in Swift 3, introdotto con l'implementazione di

È disponibile con l'istantanea di Swift 3 del 7 agosto 2016 e con Xcode 8 beta 6.

In breve:

  • Una openclasse è accessibile e sottoclassabile al di fuori del modulo di definizione. Un openmembro della classe è accessibile e sostituibile al di fuori del modulo di definizione.
  • Una publicclasse è accessibile ma non sottoclassabile al di fuori del modulo di definizione. Un publicmembro della classe è accessibile ma non sovrascrivibile al di fuori del modulo di definizione.

Così openè quello che publicera nelle precedenti versioni di Swift e l'accesso a publicè stato limitato. Oppure, come dice Chris Lattner in SE-0177: consentire la distinzione tra accesso pubblico e sovrascrivibilità pubblica :

"Aperto" ora è semplicemente "più pubblico che pubblico", fornendo un modello molto semplice e pulito.

Nel tuo esempio, open var hashValueè una proprietà accessibile e che può essere sostituita in NSObjectsottoclassi.

Per ulteriori esempi e dettagli, dai un'occhiata a SE-0117 .


16
Quindi publicin Swift 3 è come public finalin Swift 2, ed openè come public?
Clashsoft,

16
@Clashsoft: "open" in Swift 3 è come "public" in Swift 2. "public" in Swift 3 non ha equivalenti in Swift 2. (Un'ultima classe non può essere sottoclassata affatto, nemmeno nello stesso modulo.)
Martin R,

59
Questo è esilarante controintuitivo. Grazie per il riassunto.
GoldenJoe,

7
Concordo con @MikeS e la mancanza di compatibilità con le versioni precedenti rende questo disastro orribile.
HughHughTeotl,

14
Apple @MikeS: pensa diversamente, anche se non è necessario.
Varun Nath,

12

Leggi aperto come

aperto per eredità in altri moduli

Ripeto aperto per eredità in altri moduli. Quindi una classe aperta è aperta per la sottoclasse in altri moduli che includono il modulo di definizione. Open var e le funzioni sono aperte per la sostituzione in altri moduli. È il livello di accesso meno restrittivo. È buono quanto l'accesso del pubblico accetta che qualcosa che è pubblico sia chiuso per eredità in altri moduli.

Da Apple Docs :

L'accesso aperto si applica solo alle classi e ai membri della classe e differisce dall'accesso pubblico come segue:

  1. Le classi con accesso pubblico o qualsiasi livello di accesso più restrittivo possono essere sottoclassate solo all'interno del modulo in cui sono definite.

  2. I membri della classe con accesso pubblico o qualsiasi livello di accesso più restrittivo possono essere sovrascritti da sottoclassi solo all'interno del modulo in cui sono definiti.

  3. Le classi aperte possono essere sottoclassate all'interno del modulo in cui sono definite e all'interno di qualsiasi modulo che importa il modulo in cui sono definite.

  4. I membri della classe aperta possono essere sovrascritti da sottoclassi all'interno del modulo in cui sono definite e all'interno di qualsiasi modulo che importa il modulo in cui sono definite.


5

Open è un livello di accesso, è stato introdotto per imporre limitazioni sull'ereditarietà delle classi su Swift.

Ciò significa che il livello di accesso aperto può essere applicato solo alle classi e ai membri della classe .

Nelle classi

Una classe aperta può essere sottoclassata nel modulo in cui è definita e nei moduli che importano il modulo in cui è definita la classe.

Membri della classe

Lo stesso vale per i membri della classe. Un metodo aperto può essere sovrascritto da sottoclassi nel modulo in cui è definito e in moduli che importano il modulo in cui è definito il metodo.

LA NECESSITÀ DI QUESTO AGGIORNAMENTO

Alcune classi di librerie e framework non sono progettate per essere sottoclassate e ciò potrebbe comportare comportamenti imprevisti. Inoltre, la libreria Apple nativa non consentirà di ignorare gli stessi metodi e classi,

Quindi, dopo questa aggiunta, applicheranno di conseguenza i livelli di accesso pubblico e privato.

Per maggiori dettagli consulta la documentazione di Apple sul controllo degli accessi


1

Ad eccezione della sottoclasse, open class funcè accessibile anche da qualsiasi parte del progetto. Supponiamo che tu stia definendo una funzione di classe aperta nella tua classe Util in questo modo

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

Quindi, in qualsiasi punto dei controller della vista, puoi semplicemente accedere a questo metodo chiamando

Utils.printHello()

3
Questa risposta non spiega come sia diverso dal pubblico poiché puoi farlo anche con il pubblico.
Jose Ramirez,

Ho bisogno di qualche spiegazione in più
MD Aslam Ansari,

1

open vieni a giocare quando hai a che fare con più moduli.

la classe aperta è accessibile e sottoclassabile al di fuori del modulo di definizione. Un membro della classe aperto è accessibile e sostituibile al di fuori del modulo di definizione.


0

open è solo per un altro modulo, ad esempio: baccelli di cacao o unit test, possiamo ereditare o sovrascrivere

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.