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

时间:2015-05-29 11:44:05

标签: swift

我正在尝试构建一个简单的Swift应用来计算增值税(增值税= 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

              }

由于某种原因,我一直在

  

二进制运算符*不能应用于Int和Double

类型的操作数

在结果行

var result = textfield * VAT

在函数内部。

7 个答案:

答案 0 :(得分:51)

您应该将一种类型转换为另一种类型,因此两个变量应该是相同的类型:

var result: Double = Double(textfield) * VAT

答案 1 :(得分:9)

这是因为你试图将Int(文本字段)与Double(VAT)相乘。因为使用这样的操作你可能会失去双Swift的精度,不允许将一个转换为另一个,所以你需要隐式地将Int转换为Double ......

var result = Double(textfield) * VAT

答案 2 :(得分:3)

在我的情况下,它只是投射到CGFloat:

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

答案 3 :(得分:3)

这里的问题是给出的语句字面上是真的,因为Swift是强类型的,并且不会隐式强制。我自己用“二元运算符” - 也不能应用于'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
}

答案 4 :(得分:1)

你可以像转换一样 var result:Double = Double(textfield)

答案 5 :(得分:0)

当我在Playground中收到相同的错误消息时,这对我有用:

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

答案 6 :(得分:0)

我在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中一样。

一旦你意识到你的对象是一个嵌套的集合,而不是一个Ints数组,就很容易理解为什么你不能在对象上使用数字运算符。