web-dev-qa-db-fra.com

Comment rendre une propriété d'instance visible uniquement pour la sous-classe swift

J'essaie de déclarer une propriété d'instance dans Swift afin qu'elle ne soit visible que pour sa classe et ses sous-classes. Je pense que cela serait appelé une propriété protégée dans d'autres langues. moyen d'y parvenir dans Swift?

35
nwales

Le contrôle d'accès le long des lignes d'héritage ne correspond pas vraiment aux philosophies de conception derrière Swift et Cocoa:

Lors de la conception des niveaux de contrôle d'accès dans Swift, nous avons considéré deux cas d'utilisation principaux:

  • garder private les détails d'une classe cachés du reste de l'application
  • garder internal détails d'un framework caché de l'application cliente

Ils correspondent respectivement aux niveaux d'accès private et internal.

En revanche, protected associe l'accès à l'héritage, ajoutant un axe de contrôle entièrement nouveau pour raisonner. Il n'offre en fait aucune protection réelle, car une sous-classe peut toujours exposer l'API "protégée" via une nouvelle méthode ou propriété publique. Il n'offre pas non plus d'opportunités d'optimisation supplémentaires, car de nouveaux remplacements peuvent provenir de n'importe où. Et c'est inutilement restrictif - il permet aux sous-classes, mais à aucun des assistants de la sous-classe, d'accéder à quelque chose.

Il y a plus d'explications sur le Swift d'Apple.

38
rickster

Une façon de le faire est de définir la fonction ou la propriété avec le mot clé fileprivate et de définir la sous-classe dans le même fichier comme suit:

class Parent {
    fileprivate var someProperty: Any?
}

class Child: Parent {
    func someFunction() {
        print(someProperty)
    }
}

Bien sûr, c'est super ennuyeux, car ce fichier sera un énorme gâchis. Sans oublier pourquoi Swift permet cela mais pas protected est juste ... argh.

8
funct7