[Débutant swift] Définir un type dans un type ?

Hello,


 


J'ai vu sur le github d'Aligator qu'il y déclare un Type dans une autre type (en l'occurence plus dans une extension) : 



extension UIColor {
/* Private Implementation details */
...
}

extension UIColor {
enum Name : UInt32 {
case Translucent = 0xffffffcc
case ArticleBody = 0x339666ff
case Cyan = 0xff66ccff
case ArticleTitle = 0x33fe66ff
}

convenience init(named name: Name) {
self.init(rgbaValue: name.rawValue)
}
}

Je trouve cela hyper chelou, pour 2 raisons :


 


1) si le Type a une portée globale, c'est hyper dangereux car un Type nommé Name, ça court les rues.


2) donc, c'est que le Type a une portée locale mais dans ce cas, cela est bizarre car : on y a comme accès dans l'initialiseur ; si on veut factoriser la création de plusieurs objets qui ont le même nom (exemple : je veux créer 2 UIColor "blue"), on ne pourra pas d'abord créer name : Name = .Blue et ensuite color = UIColor(named:name)


 


 


@Ali, Peux-tu m'éclairer sur cette construction ?


 

 

Merci !

Réponses

  • zoczoc Membre

    Le type "Name" est un sous type de UIColor, oui. Mais je ne vois pas pourquoi ça pose problème pour la suite, il suffit d'écrire : 



    name: UIColor.Name = .Blue

  • OK !!


     


    Je ne connaissais pas cette syntaxe et cette possibilité.


     


    Merci !


  • AliGatorAliGator Membre, Modérateur
    Oui c'est un peu un principe de "namespace"

    - Le type "Name" est déclaré à  l'intérieur de la classe UIColor. Donc à  l'intérieur de la classe UIColor, tu peux directement t'y référer avec le nom court "Name". Comme j'ai fait dans le "init".

    - Le type n'était pas spécialement déclaré "private", il est "internal" par défaut, et donc est visible aussi à  l'extérieur de la classe UIColor, du moment que tu restes dans le même "module" (le même target, framework ou app, pour faire simple). Mais pour y référer depuis l'extérieur de la classe UIColor, il faut alors utiliser son nom long, "UIColor.Name"

    C'est d'ailleurs pour cela que j'ai déclaré l'enum dans la classe UIColor, pour le restreindre dans le namespace de cette classe, et ainsi éviter les conflits de nom que tu aurais sinon pu avoir comme tu l'as fait remarquer, si j'avais déclaré cet enum dans l'espace global, à  l'extérieur de toute classe.
Connectez-vous ou Inscrivez-vous pour répondre.