En Swift, les niveaux d'accès (private, fileprivate, internal, public, open) affectent non seulement les classes, les structures et leurs propriétés, mais également les types imbriqués. Un type imbriqué hérite par défaut du niveau d'accès de son type englobant, sauf indication contraire explicite.
Principaux enjeux :
internal, le type imbriqué ne peut pas être plus ouvert que l'extérieur, mais peut être plus « fermé » (par exemple, l'extérieur — public, l'imbrication — private).internal ne seront pas visibles depuis d'autres modules.Exemple :
public class A { public struct B { fileprivate func foo() {} } }
Dans cet exemple, A et B sont publics, mais la méthode foo() est privée au fichier.
Question : "Un type imbriqué peut-il avoir un niveau d'accès supérieur à celui de son type englobant ?"
Réponse : Non, le niveau d'accès d'un type imbriqué ne peut pas dépasser celui de son type englobant. Si vous essayez de déclarer un type imbriqué avec un niveau d'accès plus élevé, le compilateur générera une erreur.
Exemple d'erreur :
internal struct MyStruct { public enum MyEnum { ... } // Erreur : public ne peut pas être à l'intérieur de internal }
Histoire 1
Dans un framework général, les niveaux d'accès des structures imbriquées n'étaient pas synchronisés avec les types externes. Dans la version officielle, cela a conduit à l'impossibilité d'utiliser des énumérations internes dans une application cliente, nécessitant une modification urgente de l'interface.
Histoire 2
Dans un grand projet, un objet de service interne avait une classe imbriquée avec des statuts, déclarée comme interne. Après l'apparition d'un nouveau module dépendant de cette classe, l'intégration est devenue impossible sans augmenter le niveau d'accès et recompiler entièrement le SDK.
Histoire 3
Dans une bibliothèque complexe, certaines structures imbriquées étaient déclarées comme publiques, tandis que le conteneur lui-même était interne. Lors de la migration vers une nouvelle version, des erreurs critiques sont survenues : les types publics ne se compilaient pas dans un contexte externe, ce qui a bloqué la mise à jour de plusieurs équipes.