web-dev-qa-db-fra.com

Comment déclarer une variable «protégée» dans swift

Je veux créer une classe qui hérite d'une autre classe, qui se trouve dans un fichier différent.

Par exemple:

Class1.Swift

class Class1
{
    protected var 
    //Do Stuff
}

Class2.Swift

class Class2:Class1
{
    //Do stuff
}

Comment pourrais-je avoir accès à une variable/fonction "protégée" dans swift?

Lorsque je déclare une variable/fonction privée, je ne peux l'utiliser que dans cette classe. Si j'utilise "fileprivate", mon autre classe DOIT être dans le fichier de sauvegarde en tant que Class1. Ce que je veux faire, c'est garder mes classes dans des fichiers séparés et utiliser les groupes depuis Xcode pour savoir quelle classe appartient à quelle catégorie.

26
iProgram

Vous devez utiliser internal pour cela car Swift n'offre pas de mot clé protected (contrairement à de nombreux autres langages de programmation). internal est le seul modificateur d'accès entre fileprivate et public:

L'accès interne permet aux entités d'être utilisées dans n'importe quel fichier source de leur module de définition, mais pas dans aucun fichier source en dehors de ce module. Vous utilisez généralement l'accès interne lors de la définition de la structure interne d'une application ou d'un framework.

Il y a un article de blog qui explique un peu plus pourquoi les concepteurs de langage ont choisi de ne pas offrir un mot clé protected (ou quelque chose d'équivalent).

Certaines des raisons étant que

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.

et aussi le fait que protected causerait des problèmes en ce qui concerne les extensions, car il ne serait pas clair si les extensions devraient également avoir accès aux propriétés protected ou non.

38
Keiwan

Même si Swift ne fournit pas d'accès protected, nous pouvons obtenir un accès similaire en utilisant le contrôle d'accès fileprivate.
La seule chose que nous devons garder à l'esprit que nous devons déclarer tous les enfants dans le même fichier que le parent a déclaré dans.

Animal.Swift

import Foundation

class Animal {
    fileprivate var protectedVar: Int = 0
}

class Dog: Animal {
    func doSomething() {
        protectedVar = 1
    }
}

OtherFile.Swift

let dog = Dog()
dog.doSomething()
5
D4ttatraya