swift - bool - el operador== no se puede aplicar a operandos del tipo int y string
El operador binario*no se puede aplicar a operandos de tipo Int y Double (7)
Estoy tratando de crear una aplicación Swift simple para calcular el IVA (impuestos al valor agregado = 20%).
class ViewController: UIViewController {
@IBOutlet var resultTextView: UITextView!
@IBOutlet var inputTextField: UITextField!
@IBOutlet var calculateVATButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
func taxesFree(number: Int)-> Double{
var textfield = self.inputTextField.text.toInt()!
let VAT = 0.2
var result = textfield * VAT
return result
}
Por alguna razón sigo recibiendo
El operador binario * no se puede aplicar a operandos de tipo Int y Double
en la línea de resultados
var result = textfield * VAT
dentro de la función.
Debes convertir un tipo al otro para que ambas variables sean del mismo tipo:
var result: Double = Double(textfield) * VAT
El problema aquí es que la declaración dada es literalmente verdadera, porque Swift está fuertemente tipado y no coacciona implícitamente. Acabo de tener un caso similar con "operador binario ''-'' no se puede aplicar a operandos de tipo ''Fecha'' e ''Int''".
Si tú escribes:
var result = 10 * 0.2
... está bien, pero si escribes:
var number = 10
var result = number * 0.2
... eso no está bien.
Esto se debe a que los valores explícitos sin tipo tienen un tipo apropiado seleccionado por el compilador, de modo que la primera línea se toma como
var result = Double(10) * Double(0.2)
.
Después de todo, como ser humano, puede significar que 10 es un punto flotante o un número entero; normalmente no diría cuál y esperaría que eso esté claro por el contexto.
Puede ser un poco complicado, pero la idea de los tipos fuertes es que después de analizar el código solo puede tener una expresión compilada válida.
En general, construiría un nuevo valor utilizando el constructor, por lo que
var result = Double(textfield) * VAT
en su caso.
Esto es diferente de la conversión (campo de
textfield as Double
) porque Int no es una subclase de Doble;
en cambio, lo que está haciendo es pedir que se cree un valor Doble completamente nuevo en tiempo de ejecución, perdiendo algo de precisión si el valor es muy alto o bajo.
Esto es lo que los lenguajes tipeados hacen implícitamente con casi todos los valores inmediatos, a un costo de tiempo pequeño pero significativo.
En su caso específico, no fue valioso tener un Int en primer lugar (incluso si no es posible una fracción), por lo que lo que necesitaba era:
func taxesFree(number: Int) -> Double {
var textfield = Double(self.inputTextField.text)!
let VAT = 0.2
var result = textfield * VAT
return result
}
En mi caso, solo estaba enviando a CGFloat:
self.cnsMainFaqsViewHight.constant = CGFloat(self.mainFaqs.count) * 44.0
Es porque estás tratando de multiplicar un Int (campo de texto) con un Doble (IVA). Debido a que con una operación de este tipo, podría perder la precisión del doble Swift no permite convertir uno al otro, por lo que debe convertir explícitamente el Int en un doble ...
var result = Double(textfield) * VAT
Estaba malinterpretando el operador de rango cerrado en Swift.
No debe ajustar el rango en una matriz:
[0...10]
for i in [0...10] {
// error: binary operator ''+'' cannot be applied to operands of type ''CountableClosedRange<Int>'' and ''Int''
let i = i + 1
}
for i in 0...10 {
// ok!
let i = i + 1
}
El rango es una colección que puede ser iterada. No es necesario envolverlo en una matriz, como quizás lo hubiera hecho en Objective-C.
func getMilk(howManyCartons: Int){
print("Buy /(howManyCartons) cartons of milk")
let priceToPay: Float = Float(howManyCartons) * 2.35
print("Pay $/(priceToPay)")
}
getMilk(howManyCartons: 2)
Una vez que se da cuenta de que su objeto es una colección anidada, en lugar de una matriz de Ints, es fácil ver por qué no puede usar operadores numéricos en el objeto.
Esto funcionó para mí cuando recibí el mismo mensaje de error en Playground:
func getMilk(howManyCartons: Int){ print("Buy /(howManyCartons) cartons of milk") let priceToPay: Float = Float(howManyCartons) * 2.35 print("Pay $/(priceToPay)") } getMilk(howManyCartons: 2)
Puede convertir como resultado var: Doble = Doble (campo de texto)