【问题标题】:binary operator * cannot be applied to operands of type Int and Double二元运算符 * 不能应用于 Int 和 Double 类型的操作数
【发布时间】:2015-08-12 06:30:23
【问题描述】:

我正在尝试构建一个简单的 Swift 应用来计算增值税(增值税 = 20%)。

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    

【问题讨论】:

标签: swift


【解决方案1】:

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

var result: Double = Double(textfield) * VAT

【讨论】:

  • 感谢您的帮助,我得到了第二个错误“当我返回结果时,无法使用类型 (() 的参数列表调用结果】
  • 谢谢。这种行为是完全不方便的。这些不强制执行。 Swift 制造商应该停止将开发人员视为完全愚蠢的人。除非您明确进行四舍五入,否则任何人都会期望 1.5*5 = 7.5 而不是 7。保持操作数最高精度的经典方法是要走的路。值得信赖和证明。
【解决方案2】:

这是因为您试图将 Int(文本字段)与 Double(VAT)相乘。因为通过这样的操作,您可能会失去双精度 Swift 不允许将一个转换为另一个,因此您需要将 Int 显式转换为 Double ...

var result = Double(textfield) * VAT

【讨论】:

  • 我认为您的意思是“显式投射”
【解决方案3】:

就我而言,它只是投射到 CGFloat:

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

【讨论】:

    【解决方案4】:

    这里的问题是给出的陈述是真的,因为 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
    }
    

    【讨论】:

      【解决方案5】:

      当我在 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】:

        我在 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 中那样将它包装在一个数组中。

         0...3  ->  [0, 1, 2, 3]
        [0...3] -> [[0, 1, 2, 3]]
        

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

        【讨论】:

        • 正是我想要的。
        【解决方案7】:

        你可以像这样转换 var 结果:Double = Double(textfield)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-23
          • 1970-01-01
          • 1970-01-01
          • 2017-09-02
          相关资源
          最近更新 更多