Qu'est-ce que le mot-clé «ouvert» dans Swift?

334

Le ObjectiveC.swiftfichier de la bibliothèque standard contient les quelques lignes de code suivantes autour de la ligne 228:

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

Que open varsignifie dans ce contexte, ou quel est le openmot - clé en général?

Clashsoft
la source
2
Peut-être lié: stackoverflow.com/questions/24003918/… ("Quelle est la différence entre openet public?")
Ahmad F
Note
annexe

Réponses:

572

open est un nouveau niveau d'accès dans Swift 3, introduit avec la mise en œuvre de

Il est disponible avec l'instantané Swift 3 à partir du 7 août 2016 et avec Xcode 8 beta 6.

En bref:

  • Une openclasse est accessible et sous - classable en dehors du module de définition. Un openmembre de classe est accessible et remplaçable en dehors du module de définition.
  • Une publicclasse est accessible mais pas sous-classable en dehors du module de définition. Un publicmembre de classe est accessible mais ne peut pas être remplacé en dehors du module de définition.

Il en openest publicde même pour les versions précédentes de Swift et l'accès à publica été restreint. Ou, comme le dit Chris Lattner dans SE-0177: Permettre de faire la distinction entre accès public et priorité publique :

«Ouvert» est maintenant simplement «plus public que public», fournissant un modèle très simple et propre.

Dans votre exemple, open var hashValueest une propriété qui est accessible et peut être remplacée dans des NSObjectsous-classes.

Pour plus d'exemples et de détails, consultez SE-0117 .

Martin R
la source
16
Donc, publicdans Swift 3, c'est comme public finaldans Swift 2, et openest comme public?
Clashsoft
16
@Clashsoft: "open" dans Swift 3 est comme "public" dans Swift 2. "public" dans Swift 3 n'a pas d'équivalent dans Swift 2. (Une classe finale ne peut pas du tout être sous-classée, pas même dans le même module.)
Martin R
59
C'est hilarant contre-intuitif. Merci pour le résumé.
GoldenJoe
7
D'accord avec @MikeS, et le manque de compatibilité descendante en fait un désordre horrible.
HughHughTeotl
14
@MikeS apple - pensez différemment, même si ce n'est pas nécessaire.
Varun Nath
12

Lire ouvert comme

ouvert à l'héritage dans d'autres modules

Je répète ouvert pour l'héritage dans d'autres modules. Ainsi, une classe ouverte est ouverte pour le sous-classement dans d'autres modules qui incluent le module de définition. Les variables ouvertes et les fonctions sont ouvertes pour remplacer dans d'autres modules. C'est le niveau d'accès le moins restrictif. C'est aussi bon que l'accès public accepte que quelque chose qui est public soit fermé pour l'héritage dans d'autres modules.

Depuis Apple Docs :

L'accès ouvert ne s'applique qu'aux classes et aux membres de la classe, et il diffère de l'accès public comme suit:

  1. Les classes avec accès public, ou tout niveau d'accès plus restrictif, peuvent être sous-classées uniquement dans le module où elles sont définies.

  2. Les membres de classe avec accès public, ou tout niveau d'accès plus restrictif, peuvent être remplacés par des sous-classes uniquement dans le module où ils sont définis.

  3. Les classes ouvertes peuvent être sous-classées dans le module où elles sont définies et dans tout module qui importe le module où elles sont définies.

  4. Les membres de classe ouverts peuvent être remplacés par des sous-classes dans le module où ils sont définis et dans tout module qui importe le module où ils sont définis.

Mohammad Sadiq
la source
5

Open est un niveau d'accès, a été introduit pour imposer des limitations sur l'héritage de classe sur Swift.

Cela signifie que le niveau d'accès ouvert ne peut être appliqué qu'aux classes et aux membres de classe .

En cours

Une classe ouverte peut être sous-classée dans le module dans lequel elle est définie et dans les modules qui importent le module dans lequel la classe est définie.

Membres de la classe

La même chose s'applique aux membres de la classe. Une méthode ouverte peut être remplacée par des sous-classes dans le module dans lequel elle est définie et dans les modules qui importent le module dans lequel la méthode est définie.

LE BESOIN DE CETTE MISE À JOUR

Certaines classes de bibliothèques et d'infrastructures ne sont pas conçues pour être sous-classées et cela peut entraîner un comportement inattendu. La bibliothèque Apple native ne permet pas non plus de remplacer les mêmes méthodes et classes,

Ainsi, après cet ajout, ils appliqueront les niveaux d'accès public et privé en conséquence.

Pour plus de détails, consultez la documentation Apple sur le contrôle d'accès

Saranjith
la source
1

À l'exception de la sous-classe, an open class funcest également accessible de n'importe où dans votre projet. Supposons que vous définissez une fonction de classe ouverte dans votre classe Util comme ceci

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

Ensuite, dans n'importe lequel de vos contrôleurs de vue, vous pouvez simplement accéder à cette méthode en appelant

Utils.printHello()
Fangming
la source
3
Cette réponse n'explique pas en quoi elle est différente de publique car vous pouvez aussi le faire avec public.
Jose Ramirez
Besoin de plus d'explications à ce sujet
MD Aslam Ansari
1

ouvert venez jouer lorsque vous traitez avec plusieurs modules.

la classe ouverte est accessible et sous-classable en dehors du module de définition. Un membre de classe ouvert est accessible et remplaçable en dehors du module de définition.

Rajasekaran Gopal
la source
0

open est uniquement pour un autre module par exemple: cabosses de cacao, ou test unitaire, on peut hériter ou surcharger

William
la source