9
votes

Pourquoi Let X comme cas de flotteur ne correspond pas à un commutateur sur une variable?

J'ai une énumération pour les valeurs marquées (il s'agit d'un projet d'interpréteur de régime de jouet), comme celui-ci:

init?(value:Any) {
  switch v {
    case let v as Int: self = .int(v)
    case let v as Float: self = .float(v)
    case let v as Bool: self = .bool(v)
    ...
    default: return nil
  }
}


8 commentaires

Où est v défini?


Vous voulez probablement dire la valeur du commutateur . Littéral 0.1 est double pas float


Luka, ma mauvaise. Je changeais un peu le code comme je l'ai transcrite dans ma question. Il devrait être lu "init? (V: n'importe quel) ...".


CASE SE SE VOR-INT était meilleur, la variable associée n'est pas la même que la variable "commutée" et il y a un = manquant dans le bool ligne.


Vadian, merci. Je vais essayer de mieux lire avant de poster ma prochaine question. (Quelqu'un d'autre a fait une édition avec "valeur" au lieu de "V" et je l'ai acceptée.)


Dernier Nitpicking: Les cas d'enum sont censés commencer par une lettre minuscule à Swift 3.


@Dietrich, BTW, pouvez-vous dire, si ce n'est pas secret, quel problème que Enum devrait résoudre?


Pas de secret, juste pour un interpréteur de schéma de jouet (-SH). Dans ma mise en œuvre d'une liste liée, la voiture d'une liste est une variable de cette valeur Enum Type. L'autre option que j'ai esquissée portait les types Swift de base (INT, String, etc.) sont conformes à une extension, à un protocole de "valeur" vide, à l'aide de ce protocole comme type de la classe de liste ' voiture variable. Je pense que le choix Enum, vous fera le reste du code interprète plus clair, ce qui me permettra de commutateur sur le type d'une variable de niveau de schéma. Un troisième choix serait d'utiliser le type tout , je suppose.


3 Réponses :


12
votes

Le type déduit par défaut pour les constantes de points flottants est double , pas float . Il est défini par la bibliothèque standard SWIFT ici: https://developer.apple.com/reference/swift / Floatliteraltype Utilisation du compilateur-connu Floatliteraltype Typealias.


1 commentaires

Merci, c'était concis et illuminant!



6
votes

La documentation de Type Inference dit:

Swift choisit toujours double (plutôt que float ) lorsque vous déduisez le Type de nombres à virgule flottante.

Si vous souhaitez utiliser float , vous devez jeter explicitement le littéral: xxx


5 commentaires

Veuillez inclure une explication de Somme pour la raison pour laquelle votre code fonctionne


@ milo526 Le code dit tout clair. Facile à comprendre.


Comme je le comprends maintenant, votre cas de flotteur ne correspondra jamais non plus, tandis que votre double cas l'attrape. Je ne pense pas que votre code rend ce point clair.


@Dietrich Swift choisit toujours le double (plutôt que le flotteur) lorsque vous déduisez le type de nombre de points flottants.


Merci d'avoir clarifié cela, @ William-Hu!



1
votes

BTW, il semble que vous souhaitiez pouvoir accéder à votre type de type avec littéraux, vous pouvez donc essayer de vous conformer à votre type à expressibleBy * protocoles.

Comme: xxx


2 commentaires

Suggestion cool. J'ai vu cela et, à tort il semble, supposé que je ne pouvais pas être conforme à de nombreux protocoles "expressiblesby_literal" à la fois. Je vais essayer, merci!


En fait, j'aime beaucoup mieux que ce que j'avais fait. J'aimerais que je puisse faire vérifier «votre réponse» pour fournir une alternative plus agréable au chemin que j'étais déjà sur lorsque j'ai rencontré le problème qui a conduit à ma question initiale ».