Pourquoi ne les énumérations ont calculé les propriétés, mais pas stockées les propriétés de Swift?
Je suis nouvelle Swift et viens de tomber sur ce dans la documentation:
Les propriétés calculées sont fournis par des classes, des structures et des
les énumérations. Stockées les propriétés sont fournis uniquement pour les classes et
les structures.
Pourquoi est-ce? N'valeurs associées pour enum travail comme stockées les propriétés? Il semble qu'ils avaient stocké des propriétés initialement Pourquoi pas stockées type de propriétés pour les classes de swift?
Vous devez vous connecter pour publier un commentaire.
enum
s n'ont stocké type propriétés - c'est à dire,static
propriétés. Ils n'ont pas stockées instance propriétés. Je ne sais pas si il y a une raison technique stockées les propriétés de l'occurrence ne sont pas disponibles pourenum
s. Vous pourriez avoir à poser votre question sur le forum dev si vous voulez une réponse technique pour le "pourquoi".Dans votre question, vous vous demandez si les valeurs associées au travail comme stockée propriétés. En fait, ils le font, et sont plus souples (à certains égards) que d'être stockés propriétés pour
struct
s etclass
es. Chaquecase
dans unenum
peut avoir son propre spécialisés ensemble de données qui lui est associée. Plutôt que d'avoir un ensemble d'informations de propriétés qui s'appliquent à tous lescase
s, vous obtenez pour individualiser la stockées les propriétés de chaquecase
.Les énumérations ne permettant pas stockées les propriétés de l'occurrence est un choix de conception. Ayant enum avec stockées les propriétés de l'occurrence le rend comme un struct (avec le protocole enum superpuissances), mais seulement de type point de vue maintenant enums agira comme type de multiplicateurs. Fondamentalement envisager
Ce que cela signifie réellement que enum
Times
nous permet d'avoir n'importe quelle combinaison d'éléments deSet1
etSet2
résultant dans 6 cas distincts, mais attendez, nous savons que c'est en réalité un but d'un tuple de type comme(Set1, Set2)
, oùTimes
peuvent être déclarées commeJ'espère que cela constitue un motif raisonnable de ne pas permettre que le premier cas.
Cela étant dit, swift énumérations permettent d'associer l'arbitraire d'un n-tuple avec chaque cas, ce qui nous permet de déclarer ce qui est connu comme une discrimination de l'union dans la programmation fonctionnelle. Appeler un stockées propriété attachée à l'affaire si vous le souhaitez. À partir de types de points de vue, il agit maintenant à titre de type de basilic.
Nous avons maintenant 5 cas différents. Si nous avons maintenant un magasin de 2-tuples:
nous maintenant ont essentiellement une somme de multiplication (Set1 * Set2 + Set3 * Set4).
C'est un outil très puissant quand il s'agit de la correspondance de motif.
CEPENDANT, il existe de réelles cas où vous avez réellement envie de les imiter la forme d'stockées à l'intérieur de la propriété enum. Considérez ceci:
est déclaratif façon de définir le RESTE des points de terminaison (dans le cadre, comme Moya)
Lorsque vous voulez le feu à une demande que vous feriez quelque chose comme
Mais maintenant, imaginez que vous voulez différencier entre production et d'serveur de test. Si vous ajoutez un serveur comme un autre élément tuple dans chaque cas:
ce sera une mauvaise sémantique, depuis que vous avez l'intention de chaque tuple de stocker les paramètres de la demande, mais maintenant il stocke un serveur de base de l'adresse.
Pour éviter ce genre de choses nous pouvons paramétrer notre type de la manière suivante. Au lieu d'avoir le Serveur étant défini comme dire:
on peut la définir avec type distinct pour chaque cas comme:
et enfin paramétrer notre ServiceType comme
J'utilise une petite astuce pour stocker des propriétés qui ne sont pas accessibles lors de l'initialisation.
Tout d'abord, j'ai créer une classe
Future
qui permet de stocker l'stockées dans l'avenir la propriété:Puis-je créer mon enum:
Instancier:
Plus tard dans le code:
Et plus tard, vous pouvez accéder à la valeur:
Ce n'est pas quelque chose que vous devriez abus, mais elle peut être utile dans certains cas.
Espère que cela aide.
Un enum est considéré comme une structure du type de données qui peuvent être modifiées, sans avoir à modifier le dire un String ou Int plusieurs fois dans votre code et avec un enum nous ne pourrons jamais avoir à vous soucier de changer la même chose plus d'une fois. Par exemple menu déroulant:
Avec stockées les propriétés de u peut précalculer les informations nécessaires et de réduire le code dans votre fonction principale. Le meilleur exemple est le calcul de la taille de rect par exemple: