Foros

El operador binario de Mac '>' no se puede aplicar a operandos de tipo 'Double?' y 'Int'

abcdefg12345

Poster original
Jul 10, 2013
  • Oct 21, 2017
Estoy tratando de tener una declaración if para verificar si un valor doble en una cadena es mayor que 10, pero me gustaría obtener un error 'Operador binario'> '¿no se puede aplicar a operandos de tipo' Doble? ' y 'Int' 'cualquiera sabe lo que estoy haciendo mal.

rápido 4
Código: if (Double(MyValue) > 10) { // value is bigger than 10 } else { // do something else }
Estoy usando una cadena variable porque necesito que sea una cadena para poder formatearla más adelante, la definí como
Código: var MyValue = ''

abcdefg12345

Poster original
Jul 10, 2013


  • Oct 21, 2017
lo arregló agregando otra variable
Código: let CheckValue = Double(MyValue)! if CheckValue > 10 { }
Reacciones:960 diseño

0002378

Suspendido
28 de mayo de 2017
  • Oct 23, 2017
Creo que Swift, como lenguaje, es bastante risible a veces, especialmente. procedente de la programación Java. Y mencionaste uno de los mejores ejemplos de eso.

Y, aunque los opcionales tienen sus beneficios, también me dan ganas de aplastar mi computadora contra los bordes superiores de un contenedor de basura.

Sin embargo, donde Swift realmente patea traseros es en el departamento de cierres ... ¡oh sí! Java también los tiene, ahora, pero ...

Y, por supuesto, el hecho de que Swift sea menos estricto en la declaración de tipos y esos molestos puntos y coma ... ¡increíble!

Reacciones:abcdefg12345

0002378

Suspendido
28 de mayo de 2017
  • Oct 24, 2017
Oh, espera, ahora que miro hacia atrás en tu código, veo que tu valor Double (cadena) se evalúa como Double ?, que es un valor opcional.

No necesitas una nueva variable. Simplemente puede agregar '!' a su Double (cadena), y funcionará.

Supongo que estaba equivocado acerca de que Swift fuera estúpido en este caso. Pero, me he encontrado con muchos casos de quejas del compilador (no puedo comparar dos tipos numéricos diferentes).

Greene

Jul 15, 2015
Fort Worth
  • Oct 24, 2017
Creo que una solución más limpia y rápida sería almacenar su MyValue como doble o int (que parece ser). Luego puede usar un NumberFormatter para manejar el formato.

O puede usar un enlace opcional para desenvolver el valor. Primero probaría uno de estos métodos antes de usar un desenvolvimiento forzado

gnasher729

Suspendido
25 de noviembre de 2005
  • Oct 24, 2017
maculateConception dijo: Creo que Swift, como lenguaje, es bastante ridículo a veces, esp. procedente de la programación Java. Y mencionaste uno de los mejores ejemplos de eso.
Eso es bastante despistado. El problema es que el OP no conoce una característica básica de Swift, que son los valores opcionales. El constructor Double (String) obviamente puede fallar si el String no contiene un número. Es por eso que Double (String) no produce y no puede producir un resultado de tipo Double, pero ¿uno de tipo Double? , que es un Double opcional. Y un Double opcional no se puede comparar con un Int.

Tu 'solución' es realmente terrible. Los ! significa 'Estoy seguro de que esta conversión se realizará correctamente. Si no es así, bloquee la aplicación '. sea ​​d = Double ('1234x')! simplemente se estrellará. Intencionalmente. Porque no marcó cero, y fue cero.

La forma correcta es comprobar el error. Por ejemplo

si sea d = Double (MyValue), d> 10 {
// MyValue contenía un número, y el número es> 10.
} demás {
// MyValue no contenía un número, o el número era<= 10.
}

Si cree que vale la pena escribir código que sea seguro y que realmente funcione, Swift es el idioma adecuado.
Reacciones:atmenterprises y ajthom90

0002378

Suspendido
28 de mayo de 2017
  • Oct 24, 2017
gnasher729 dijo: Eso es bastante despistado. El problema es que el OP no conoce una característica básica de Swift, que son los valores opcionales. El constructor Double (String) obviamente puede fallar si el String no contiene un número. Es por eso que Double (String) no produce y no puede producir un resultado de tipo Double, pero ¿uno de tipo Double? , que es un Double opcional. Y un Double opcional no se puede comparar con un Int.

¿Fuiste intimidado en la escuela? Pareces tener una autoestima bastante baja porque no pudiste responder sin atacarme.

Esta será mi primera y última comunicación contigo. Sugerencia para ti: intenta comunicarte de una manera más civilizada y la vida será genial. Cuídate.

Greene

Jul 15, 2015
Fort Worth
  • Oct 25, 2017
gnasher729 dijo: La forma correcta es verificar el error. Por ejemplo

si sea d = Double (MyValue), d> 10 {
// MyValue contenía un número, y el número es> 10.
} demás {
// MyValue no contenía un número, o el número era<= 10.
}

Esto es ambiguo, ¿y si el valor es<= 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 forma mucho más limpia sería:

Código: // Handle your unwrapping here, and specify what to do in case of a nil guard let d = Double(MyValue) else { return } // Then implement your if statement if d > 10 { // Do what you want if d > 10 } else { // Do what you want if d <= 10 }
Aunque, realmente creo que MyValue debería almacenarse como un Double desde el principio, y un NumberFormatter implementado más tarde para manejar cualquier formato que se necesite. Eso tiene una carga cognitiva mucho menor para quien termine leyendo el código.
Reacciones:atmenterprises

gnasher729

Suspendido
25 de noviembre de 2005
  • Oct 26, 2017
maculateConception dijo: ¿Te acosaron en la escuela? Pareces tener una autoestima bastante baja porque no pudiste responder sin atacarme.

Esta será mi primera y última comunicación contigo. Sugerencia para ti: intenta comunicarte de una manera más civilizada y la vida será genial. Cuídate.

Bueno, yo no te ataqué. Ataqué tu publicación, que demuestra que sabes muy poco sobre Swift e incluí una recomendación muy peligrosa. S

SAIRUS

a
21 de agosto de 2008
  • Oct 26, 2017
Guardo la mayoría de las veces, pero si cada una de las funciones de una clase guarda la misma variable ... es posible que desee reconsiderar su interfaz inicial.

insertar

Mar 14, 2018
  • Mar 14, 2018
Swift, no está seguro de que su valor sea exactamente int. Hay dos opciones para asegurarse.
1) '!' puede indicar que este valor será int exacto agregando la marca.
Código: if (Double(MyValue)! > 10) { // } 2) Puede especificar el tipo al definir el valor.
Código: let value: Int = Double(MyValue)! if (value > 10) { // } A

atmenterprises

28 de enero de 2006
  • Mar 27, 2018
ynstek dijo: Swift, no está seguro de que su valor sea exactamente int. Hay dos opciones para asegurarse.
1) '!' puede indicar que este valor será int exacto agregando la marca.
Código: if (Double(MyValue)! > 10) { // } 2) Puede especificar el tipo al definir el valor.
Código: let value: Int = Double(MyValue)! if (value > 10) { // }

Creo que su ejemplo n. ° 2 fallaría porque está tratando de asignar una cadena de conversión a un doble a una variable Int. Además, está asumiendo que MyValue no es nulo, lo que podría causar un error en tiempo de ejecución si es nulo o no numérico.

Su explicación de ejemplo n. ° 1 tampoco es correcta. Un signo de exclamación no convierte un valor en un Int. Desenvuelve el valor de una variable opcional. En su ejemplo, terminaría con un valor Double, no un Int, y solo si MyValue no fuera nil o un valor no numérico.