Forum

L'opérateur binaire Mac « > » ne peut pas être appliqué aux opérandes de type « Double ? » et 'Int'

abcdefg12345

Affiche originale
10 juil. 2013
  • 21 octobre 2017
J'essaie d'avoir une instruction if pour vérifier si une valeur double dans une chaîne est supérieure à 10, mais je souhaite obtenir une erreur « L'opérateur binaire » > » ne peut pas être appliqué aux opérandes de type « Double ? » et 'Int'' n'importe qui sait ce que je fais mal.

rapide 4
Code : |_+_|
j'utilise une chaîne variable car j'ai besoin que ce soit une chaîne pour pouvoir la formater plus tard, je l'ai définie comme
Code : |_+_|

abcdefg12345

Affiche originale
10 juil. 2013


  • 21 octobre 2017
l'a corrigé en ajoutant une autre variable
Code : |_+_|
Réactions :960design

0002378

Suspendu
28 mai 2017
  • 23 octobre 2017
Je pense que Swift, en tant que langue, est parfois assez risible, en particulier. provenant de la programmation Java. Et vous avez évoqué l'un des meilleurs exemples de cela.

Et, bien que les options aient leurs avantages, elles me donnent également envie de casser mon ordinateur contre les bords supérieurs d'une benne à ordures.

Cependant, là où Swift botte vraiment le cul, c'est dans le domaine des fermetures ... oh ouais ! Java les a aussi, maintenant, mais ...

Et, bien sûr, le fait que Swift soit moins strict dans la déclaration des types et ces embêtants points-virgules... génial !

Réactions :abcdefg12345

0002378

Suspendu
28 mai 2017
  • 24 octobre 2017
Oh, attendez, maintenant que je repense à votre code, je vois que votre valeur Double (string) est évaluée à Double?, qui est une valeur facultative.

Vous n'avez pas besoin d'une nouvelle variable. Vous pouvez simplement ajouter '!' à votre Double (string), et cela fonctionnera.

Je suppose que j'avais tort de dire que Swift était stupide dans ce cas. Mais, j'ai rencontré de nombreux cas de telles plaintes de compilateur (impossible de comparer deux types numériques différents).

Greene

15 juillet 2015
Fort Worth
  • 24 octobre 2017
Je pense qu'une solution plus propre et plus Swifty serait de stocker votre MyValue en tant que double ou int (ce qui semble être). Vous pouvez ensuite utiliser un NumberFormatter pour gérer le formatage.

Ou vous pouvez utiliser une liaison facultative pour déballer la valeur. J'essayerais d'abord l'une de ces méthodes avant d'utiliser un dépliage forcé

grinceur729

Suspendu
25 novembre 2005
  • 24 octobre 2017
maculateConception a déclaré : Je pense que Swift, en tant que langage, est parfois assez risible, en particulier. provenant de la programmation Java. Et vous avez évoqué l'un des meilleurs exemples de cela.
C'est assez nul. Le problème est que l'OP ne connaît pas une fonctionnalité de base de Swift, qui sont des valeurs facultatives. Le constructeur Double(String) peut évidemment échouer si la chaîne ne contient pas de nombre. C'est pourquoi Double (String) ne produit pas et ne peut pas produire de résultat de type Double, mais un de type Double ? , c'est un Double facultatif. Et un Double facultatif ne peut pas être comparé à un Int.

Votre 'solution' est vraiment, vraiment horrible. Les ! signifie 'Je suis sûr que cette conversion réussira. Si ce n'est pas le cas, veuillez planter l'application. soit d = Double ('1234x') ! va juste s'écraser. Intentionnellement. Parce que vous n'avez pas vérifié le néant, et c'était le cas.

La bonne façon est de vérifier l'erreur. Par exemple

si soit d = Double (MaValeur), d > 10 {
// MyValue contenait un nombre, et le nombre est > 10.
} autre {
// MyValue ne contenait pas de nombre, ou le nombre était<= 10.
}

Si vous pensez qu'il vaut la peine d'écrire du code sûr et qui fonctionne réellement, alors Swift est le bon langage.
Réactions :atmenterprises et ajthom90

0002378

Suspendu
28 mai 2017
  • 24 octobre 2017
gnasher729 a dit : C'est tout à fait ignorant. Le problème est que l'OP ne connaît pas une fonctionnalité de base de Swift, qui sont des valeurs facultatives. Le constructeur Double(String) peut évidemment échouer si la chaîne ne contient pas de nombre. C'est pourquoi Double (String) ne produit pas et ne peut pas produire de résultat de type Double, mais un de type Double ? , c'est un Double facultatif. Et un Double facultatif ne peut pas être comparé à un Int.

Avez-vous été harcelé à l'école ? Vous semblez avoir une assez faible estime de vous-même parce que vous ne pouviez pas répondre sans m'attaquer.

Ce sera ma première et dernière communication avec vous. Suggestion pour vous - essayez de communiquer d'une manière plus civile, et la vie sera belle. Prends soin.

Greene

15 juillet 2015
Fort Worth
  • 25 octobre 2017
gnasher729 a dit : La bonne manière est de vérifier l'erreur. Par exemple

si soit d = Double (MaValeur), d > 10 {
// MyValue contenait un nombre, et le nombre est > 10.
} autre {
// MyValue ne contenait pas de nombre, ou le nombre était<= 10.
}

Ceci est ambigu - et si la valeur étant<= 10 should produce different results from the value being nil? To be fair, the OP's post is ambiguous as they were forcing the unwrap, meaning a nil value would crash. However in most business cases, a nil value would be handled differently (safely) from an insufficient value.

Une manière beaucoup plus propre serait :

Code : |_+_|
Cependant, je pense vraiment que MyValue devrait être stocké en tant que Double dès le début, et un NumberFormatter implémenté plus tard pour gérer tout formatage nécessaire. Cela a une charge cognitive beaucoup plus faible pour celui qui finit par lire le code.
Réactions :les entreprises

grinceur729

Suspendu
25 novembre 2005
  • 26 octobre 2017
maculateConception a dit : Avez-vous été victime d'intimidation à l'école ? Vous semblez avoir une assez faible estime de vous-même parce que vous ne pouviez pas répondre sans m'attaquer.

Ce sera ma première et dernière communication avec vous. Suggestion pour vous - essayez de communiquer d'une manière plus civile, et la vie sera belle. Prends soin.

Eh bien, je ne t'ai pas attaqué. J'ai attaqué votre message, qui démontre que vous en savez très peu sur Swift, et incluait une recommandation très dangereuse. S

SAIRUS

à
21 août 2008
  • 26 octobre 2017
Je garde la plupart du temps, mais si chacune des fonctions d'une classe garde la même variable... vous voudrez peut-être reconsidérer votre interface initiale.

insérer

14 avr. 2018
  • 14 avr. 2018
Swift, n'est pas sûr que votre valeur soit exactement int. Il y a deux options pour s'en assurer.
1) '!' vous pouvez indiquer que cette valeur sera exacte en ajoutant la marque.
Code : |_+_| 2) Vous pouvez spécifier le type lors de la définition de la valeur.
Code : |_+_| À

les entreprises

28 janvier 2006
  • 27 avr. 2018
ynstek a dit : Swift, n'est pas sûr que votre valeur soit exactement int. Il y a deux options pour s'en assurer.
1) '!' vous pouvez indiquer que cette valeur sera exacte en ajoutant la marque.
Code : |_+_| 2) Vous pouvez spécifier le type lors de la définition de la valeur.
Code : |_+_|

Je pense que votre exemple #2 échouerait parce que vous essayez d'affecter une chaîne convertie à un double à une variable Int. En outre, vous supposez que MyValue n'est pas nul, ce qui pourrait provoquer une erreur d'exécution si elle est nulle ou non numérique.

Votre explication de l'exemple n°1 n'est pas juste non plus. Un point d'exclamation ne convertit pas une valeur en un Int. Il déroule la valeur d'une variable facultative. Dans votre exemple, vous vous retrouveriez avec une valeur Double, pas un Int, et seulement si MyValue n'était pas nil ou une valeur non numérique.