Fòrums

L'operador binari de Mac '>' no es pot aplicar als operands del tipus 'Doble?' i 'Int'

abcdefg12345

Cartell original
Jul 10, 2013
  • Oct 21, 2017
Intento tenir una instrucció if per comprovar si un valor doble en una cadena és més gran que 10, però tinc ganes d'obtenir un error 'L'operador binari '>' no es pot aplicar als operands del tipus 'Doble?' i 'Int'' algú sap què estic fent malament.

ràpid 4
Codi: |_+_|
Estic fent servir una cadena variable perquè necessito que sigui una cadena per poder-la formatar més endavant, la vaig definir com
Codi: |_+_|

abcdefg12345

Cartell original
Jul 10, 2013


  • Oct 21, 2017
ho va solucionar afegint una altra variable
Codi: |_+_|
Reaccions:Disseny 960

0002378

Suspès
28 de maig de 2017
  • Oct 23, 2017
Crec que Swift, com a llenguatge, és bastant risible de vegades, especialment. procedent de la programació Java. I vas plantejar un dels millors exemples d'això.

I, tot i que els opcionals tenen els seus avantatges, també em fan venir ganes d'aixafar el meu ordinador contra les vores superiors d'un contenidor d'escombraries.

No obstant això, on Swift realment fa una puntada de cul és al departament de tancaments... oh, sí! Java també els té, ara, però...

I, per descomptat, el fet que Swift sigui menys estricte en la declaració de tipus i aquells molestos punt i coma... increïble!

Reaccions:abcdefg12345

0002378

Suspès
28 de maig de 2017
  • Oct 24, 2017
Oh, espera, ara que miro enrere el teu codi, veig que el teu valor Double(string) s'avalua com a Double?, que és un valor opcional.

No necessiteu cap variable nova. Només podeu afegir '!' al vostre Double (cadena), i funcionarà.

Suposo que m'he equivocat de que Swift fos estúpid en aquest cas. Però, he trobat molts casos d'aquestes queixes del compilador (incapaç de comparar dos tipus numèrics diferents).

Greene

Jul 15, 2015
Fort Worth
  • Oct 24, 2017
Crec que una solució més neta i ràpida seria emmagatzemar el vostre MyValue com a doble o int (que sembla ser). A continuació, podeu utilitzar un NumberFormatter per gestionar el format.

O podeu utilitzar l'enllaç opcional per desembolicar el valor. Primer provaria un d'aquests mètodes abans d'utilitzar un desembolicat forçat

gnasher729

Suspès
25 de novembre de 2005
  • Oct 24, 2017
maculateConception va dir: Crec que Swift, com a llenguatge, és bastant risible de vegades, especialment. procedent de la programació Java. I vas plantejar un dels millors exemples d'això.
Això és bastant despistat. El problema és que l'OP no coneix una característica bàsica de Swift, que són els valors opcionals. El constructor Double(String) òbviament pot fallar si la cadena no conté un número. És per això que Double (String) no produeix ni pot produir un resultat de tipus Double, sinó un de tipus Double? , això és un doble opcional. I un doble opcional no es pot comparar amb un Int.

La teva 'solució' és molt, molt horrible. El! significa 'Estic segur que aquesta conversió tindrà èxit'. Si no és així, si us plau, bloqueja l'aplicació. sigui d = Doble ('1234x')! simplement estavellarà. Intencionalment. Perquè no vas comprovar si no, i va ser nul.

La manera correcta és comprovar l'error. Per exemple

si deixem d = Doble (El meuValor), d > 10 {
// MyValue contenia un número i el nombre és > 10.
} altrament {
// MyValue no contenia cap número, o el número sí<= 10.
}

Si creieu que val la pena escriure codi que sigui segur i que funcioni realment, aleshores Swift és l'idioma adequat.
Reaccions:atmenterprises i ajthom90

0002378

Suspès
28 de maig de 2017
  • Oct 24, 2017
gnasher729 va dir: Això és bastant despistat. El problema és que l'OP no coneix una característica bàsica de Swift, que són els valors opcionals. El constructor Double(String) òbviament pot fallar si la cadena no conté un número. És per això que Double (String) no produeix ni pot produir un resultat de tipus Double, sinó un de tipus Double? , això és un doble opcional. I un doble opcional no es pot comparar amb un Int.

Va ser assetjat a l'escola? Sembla que tens una autoestima força baixa perquè no pots respondre sense atacar-me.

Aquesta serà la meva primera i última comunicació amb tu. Suggeriment per a vostè: intenteu comunicar-vos d'una manera més civil i la vida serà fantàstica. Cuida't.

Greene

Jul 15, 2015
Fort Worth
  • Oct 25, 2017
gnasher729 va dir: La manera correcta és comprovar l'error. Per exemple

si deixem d = Doble (El meuValor), d > 10 {
// MyValue contenia un número i el nombre és > 10.
} altrament {
// MyValue no contenia cap número, o el número sí<= 10.
}

Això és ambigu - què passa si el valor és<= 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.

Una manera molt més neta seria:

Codi: |_+_|
Tot i que, realment crec que MyValue s'hauria d'emmagatzemar com a Double des del principi, i un NumberFormatter implementat més tard per gestionar qualsevol format que sigui necessari. Això té una càrrega cognitiva molt menor per a qui acaba llegint el codi.
Reaccions:empreses

gnasher729

Suspès
25 de novembre de 2005
  • Oct 26, 2017
maculateConception va dir: Va ser assetjat a l'escola? Sembla que tens una autoestima força baixa perquè no pots respondre sense atacar-me.

Aquesta serà la meva primera i última comunicació amb tu. Suggeriment per a vostè: intenteu comunicar-vos d'una manera més civil i la vida serà fantàstica. Cuida't.

Bé, jo no t'he atacat. Vaig atacar la teva publicació, que demostra que en saps molt poc sobre Swift, i vaig incloure una recomanació molt perillosa. S

SAIRUS

a
21 d'agost de 2008
  • Oct 26, 2017
Guardo la majoria de vegades, però si cadascuna de les funcions d'una classe guarda la mateixa variable... potser voldria reconsiderar la vostra interfície inicial.

inserir

Mar 14, 2018
  • Mar 14, 2018
Swift, no està segur que el vostre valor sigui exactament int. Hi ha dues opcions per assegurar-se.
1) '!' podeu indicar que aquest valor serà int exact afegint la marca.
Codi: |_+_| 2) Podeu especificar el tipus en definir el valor.
Codi: |_+_| A

empreses

28 de gener de 2006
  • Mar 27, 2018
ynstek va dir: Swift, no estàs segur que el teu valor sigui exactament int. Hi ha dues opcions per assegurar-se.
1) '!' podeu indicar que aquest valor serà int exact afegint la marca.
Codi: |_+_| 2) Podeu especificar el tipus en definir el valor.
Codi: |_+_|

Crec que el vostre exemple número 2 fallaria perquè esteu intentant assignar un llançament de cadena a un doble a una variable Int. A més, suposeu que MyValue no és nul, cosa que podria provocar un error d'execució si fos nul o no numèric.

La teva explicació d'exemple número 1 tampoc és correcta. Un signe d'exclamació no converteix un valor en un valor Int. Desembolica el valor d'una variable opcional. En el vostre exemple, acabareu amb un valor Double, no un Int, i només si MyValue no fos nul o un valor no numèric.