二元运算符*不能应用于Int和Double类型的操作数

问题描述:

我正尝试构建一个简单的Swift应用程序来计算增值税(增值税= 20%)。二元运算符*不能应用于Int和Double类型的操作数

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 

       } 

出于某种原因,我一直对结果行越来越

二元运算符*不能用于int类型的操作数和双

var result = textfield * VAT 

内功能。

+0

可能重复http://*.com/questions/29880051 /不能待应用到操作数-的型的UITextField和-INT) – nhgrif

你应该一种类型转换为另一种这样既变量应该是同一类型:

var result: Double = Double(textfield) * VAT 
+0

感谢你,帮助没有,我收到了第二个错误“不能用型(()的参数列表调用的结果 - 当我返回结果 –

+0

见编辑答案。 – Greg

+5

谢谢你。这种行为完全是不方便的。这些都是不被执行。斯威夫特制定者应停止治疗开发商总愚氓。任何人都会想到1.5 * 5 = 7.5,而不是7,除非你明确地做四舍五入保持最高精度的经典方法o f操作数是要走的路。值得信赖和证明。 –

这是因为你想乘一个Int(文本字段)与双(VAT)。因为这样的操作可能会失去双雨燕的精度不允许转换一个到另一个,所以你需要隐式转换的诠释为Double ...

var result = Double(textfield) * VAT 

在我的情况下,它是只是铸造CGFloat的:

self.cnsMainFaqsViewHight.constant = CGFloat(self.mainFaqs.count) * 44.0 

这里的问题是,给出的说法是完全正确的,因为雨燕是强类型并不会隐式强制。我自己用“二元运算符” - “'不能应用于'Date'和'Int''类型的操作数。

如果你写:

var result = 10 * 0.2 

...这很好,但如果你写:

var number = 10 
var result = number * 0.2 

......这不是罚款。这是因为无类型的显式值具有由编译器选择的适当类型,所以实际上第一行被认为是var result = Double(10) * Double(0.2)。毕竟,作为一个人,你可能意味着10是浮点或整数 - 你通常不会说哪一个,并期望从上下文中清楚。这可能有点痛苦,但强类型的想法是,在解析代码后,它只能有一个有效的编译表达式。

一般来说,你会使用构造函数来创建一个新的值,所以你的情况为var result = Double(textfield) * VAT。这与铸造(textfield as Double)不同,因为Int不是Double的子类;你正在做的是要求在运行时建立一个全新的Double值,如果该值非常高或低,则会失去一些准确性。这就是松散类型的语言以很小但很重要的时间成本隐含地实现几乎所有的即时值。

在特定情况下,是不值钱的有一个Int摆在首位所以你需要的是(即使没有分数部分是可能的):

func taxesFree(number: Int) -> Double { 
    var textfield = Double(self.inputTextField.text)! 
    let VAT = 0.2 
    var result = textfield * VAT 
    return result 
} 

这为我工作,当我在Playground中得到了同样的错误信息:

func getMilk(howManyCartons: Int){ 
    print("Buy \(howManyCartons) cartons of milk") 
    let priceToPay: Float = Float(howManyCartons) * 2.35 
    print("Pay $\(priceToPay)") 
} 
getMilk(howManyCartons: 2) 

我在Swift中误解了the Closed Range Operator

你应该包裹范围的数组:[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 
} 

范围是本身可以迭代的集合。没有必要把它包在一个阵列,也许你会在Objective-C。

一旦你意识到你的对象是一个嵌套的集合,而不是整数数组,可以很容易地看到你为什么不能在对象上使用数值运算符。

可以像 VAR结果转换:双=双(文本框)

的[不能被应用于类型“的UITextField”和“INT”的操作数(