Contrôle d'accès Swift
Le contrôle d'accès peut restreindre le niveau d'accès du code dans d'autres fichiers sources ou modules à votre code.
Vous pouvez définir explicitement des niveaux d'accès pour des types individuels (classes, structures, énumérations), et également définir des niveaux d'accès pour les propriétés, fonctions, initialiseurs, types de base, indices, etc. de ces types.
Les protocoles peuvent également être limités à une certaine portée, y compris les constantes globales, les variables et les fonctions dans le protocole.
Le contrôle d'accès est basé sur des modules et des fichiers sources.
Un module désigne un framework ou une application construit et publié comme une unité indépendante. En Swift, un module peut utiliser le mot-clé import pour importer un autre module.
Un fichier source est un fichier de code source unique, qui appartient généralement à un module. Un fichier source peut contenir les définitions de plusieurs classes et fonctions.
Swift propose quatre niveaux d’accès différents pour les entités dans le code :public、internal、fileprivate、private。
| Niveau d’accès | Définition |
|---|---|
| public | Peut accéder à toute entité dans les fichiers source de son propre module, et d’autres peuvent également accéder à toutes les entités des fichiers source en important le module. |
| internal | Peut accéder à toute entité dans les fichiers source au sein de son propre module, mais d’autres ne peuvent pas accéder aux entités des fichiers source de ce module. |
| fileprivate | Privé au fichier, ne peut être utilisé que dans le fichier source actuel. |
| private | On ne peut y accéder qu’au sein de la classe ; une fois en dehors de la portée de la classe ou de la structure, il est inaccessible. |
public est le niveau d’accès le plus élevé, et private est le niveau d’accès le plus bas.
Syntaxe
Utilisez les modificateurs public, internal, fileprivate et private pour déclarer le niveau d’accès d’une entité :
Exemple
Sauf indication contraire, les entités utilisent le niveau d’accès par défaut internal.
Le niveau d’accès non spécifié vaut internal par défaut
Contrôle d’accès des types de fonctions
Le niveau d’accès d’une fonction est déterminé par les niveaux d’accès de ses types de paramètres et de son type de retour.
L'exemple suivant définit une fonction globale nommée someFunction sans déclarer explicitement son niveau d'accès.
func someFunction() -> (SomeInternalClass, SomePrivateClass) {
// 函数实现
}
L'une des classes dans la fonction, SomeInternalClass, a un niveau d'accès internal, et une autre, SomePrivateClass, a un niveau d'accès private. Par conséquent, selon le principe du niveau d'accès des tuples, le niveau d'accès du tuple est private (le niveau d'accès du tuple est le même que le niveau d'accès le plus bas parmi les types du tuple).
Comme le type de retour de la fonction a un niveau d'accès private, vous devez utiliser le modificateur private pour déclarer explicitement la fonction :
private func someFunction() -> (SomeInternalClass, SomePrivateClass) {
// 函数实现
}
Déclarer la fonction comme public ou internal, ou utiliser le niveau d'accès par défaut internal, est incorrect, car si vous le faites, vous ne pouvez pas accéder à la valeur de retour de niveau private.
Contrôle d'accès des types d'énumération
Le niveau d'accès des membres d'une énumération est hérité de l'énumération ; vous ne pouvez pas déclarer individuellement des niveaux d'accès différents pour les membres de l'énumération.
Exemple
Par exemple, dans l'exemple suivant, l'énumération Student est explicitement déclarée comme public, donc ses membres Name et Mark ont aussi le niveau d'accès public :
Exemple
La sortie de l'exécution du programme ci-dessus est :
学生成绩: 98,97,95
Contrôle d'accès des sous-classes
Le niveau d'accès d'une sous-classe ne doit pas être supérieur à celui de sa superclasse. Par exemple, si la superclasse a un niveau d'accès interne, la sous-classe ne peut pas être déclarée publique.
Exemple
La sortie de l'exécution du programme ci-dessus est :
Superclass
Contrôle d'accès pour les constantes, variables, propriétés et indices
Les constantes, les variables et les propriétés ne peuvent pas avoir un niveau d'accès supérieur à celui de leurs types.
Par exemple, si vous définissez une propriété avec un niveau d'accès public mais que son type est private, le compilateur ne l'autorisera pas.
De même, un indice ne peut pas avoir un niveau d'accès supérieur à celui de son type d'index ou de son type de retour.
Si le type défini d'une constante, d'une variable, d'une propriété ou d'un index d'indice est private, ils doivent alors déclarer explicitement leur niveau d'accès comme private :
private var privateInstance = SomePrivateClass()
Contrôle d'accès des getters et des setters
Les niveaux d'accès des getters et des setters pour les constantes, les variables, les propriétés et les index d'indices sont hérités du niveau d'accès du membre auquel ils appartiennent.
Le niveau d'accès d'un setter peut être inférieur à celui du getter correspondant, ce qui vous permet de contrôler les autorisations de lecture et d'écriture des variables, des propriétés ou des index d'indices.
Exemple
Le niveau d'accès de counter est fileprivate, il est donc accessible dans le fichier.
La sortie de l'exécution du programme ci-dessus est :
计数器: 100 新增加数量 100 计数器: 800 新增加数量 700
Contrôle d'accès des initialiseurs et des initialiseurs par défaut
Initialisation
Nous pouvons déclarer des niveaux d'accès pour les initialiseurs personnalisés, mais ils ne doivent pas être supérieurs au niveau d'accès de la classe à laquelle ils appartiennent. Toutefois, les initialiseurs requis font exception ; leur niveau d'accès doit être identique au niveau d'accès de la classe à laquelle ils appartiennent.
Tout comme les paramètres de fonction ou de méthode, les niveaux d'accès des paramètres d'initialiseur ne peuvent pas être inférieurs au niveau d'accès de l'initialiseur.
Méthodes d'initialiseur par défaut
Swift fournit un initialiseur par défaut sans paramètre pour les structures et les classes afin de fournir des opérations d'affectation pour toutes leurs propriétés, mais il ne donne pas de valeurs spécifiques.
Le niveau d'accès d'un initialiseur par défaut est le même que le niveau d'accès de son type conteneur.
Exemple
Utilisez le mot-clé required avant la méthode init() de chaque sous-classe pour déclarer les permissions d'accès.
Exemple
La sortie de l'exécution du programme ci-dessus est :
10 30 10
Contrôle d'accès aux protocoles
Si vous souhaitez déclarer explicitement un niveau d'accès pour un protocole, notez que vous devez vous assurer que le protocole n'est utilisé que dans la portée du niveau d'accès que vous avez déclarée.
Si vous définissez un protocole avec un niveau d'accès public, les fonctions requises qui implémentent le protocole auront également un niveau d'accès public. Cela diffère des autres types. Par exemple, pour les autres types avec un niveau d'accès public, leurs membres ont un niveau d'accès interne.
Exemple
La sortie de l'exécution du programme ci-dessus est :
res is: 20 res is: 30 res is: 50
Contrôle d’accès des extensions
Vous pouvez étendre des classes, des structures et des énumérations lorsque les conditions le permettent. Les membres d’extension doivent avoir le même niveau d’accès que les membres de la classe d’origine. Par exemple, si vous étendez un type public, vos membres nouvellement ajoutés doivent avoir le même niveau d’accès interne par défaut que les membres d’origine.
Vous pouvez également déclarer explicitement le niveau d’accès de l’extension (par exemple en utilisant private extension) pour déclarer un nouveau niveau d’accès par défaut pour tous les membres de l’extension. Ce nouveau niveau d’accès par défaut peut encore être remplacé par les niveaux d’accès déclarés par des membres individuels.
Contrôle d’accès générique
Le niveau d’accès d’un type générique ou d’une fonction générique est le niveau d’accès le plus faible parmi le type générique, la fonction elle-même et les paramètres de type génériques.
Exemple
La sortie de l'exécution du programme ci-dessus est :
["Swift"] ["Swift", "泛型"] ["Swift", "泛型", "类型参数"] ["Swift", "泛型", "类型参数", "类型参数名"]
Alias de type
Tout alias de type que vous définissez sera traité comme un type différent aux fins du contrôle d'accès. Le niveau d'accès d'un alias de type ne peut pas être supérieur au niveau d'accès du type d'origine.
Par exemple, un alias de type de niveau private peut être défini pour un type public, internal ou private, mais un alias de type de niveau public ne peut être défini que pour un type public, et ne peut pas être défini pour des types internal ou private.
Remarque : cette règle s'applique également lors du nommage d'alias pour des types associés afin de satisfaire à la conformité au protocole.
Exemple
La sortie de l'exécution du programme ci-dessus est :
["Swift"] ["Swift", "泛型"] ["Swift", "泛型", "Where 语句"] ["Swift", "泛型", "Where 语句"]Autres extensions