【问题标题】:Binary operator '*' cannot be applied to operands of type 'Float' and 'Double'二元运算符'*'不能应用于'Float'和'Double'类型的操作数
【发布时间】:2019-05-29 05:23:34
【问题描述】:

我正在实施AudioVisualizer,我正在尝试计算音频时间,但我遇到了错误

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

这是我的代码:

 var lowPassReslts: Double = 0.0
 var lowPassReslts1: Double = 0.0

 let ALPHA: Float = 1.05

 let averagePowerForChannel = pow(10, (0.05 * audioPlayer.averagePower(forChannel: 0)))
 lowPassReslts = ALPHA * averagePowerForChannel + (1.0 - ALPHA) * lowPassReslts //HERE i am getting error which i mention above

 let averagePowerForChannel1 = pow(10, (0.05 * audioPlayer.averagePower(forChannel: 1)))
 lowPassReslts1 = ALPHA * averagePowerForChannel1 + (1.0 - ALPHA) * lowPassReslts1 //HERE i am getting error

上面的代码 O 是从 Objective-C 转换而来的。此代码在 Objective-C 中完美运行,但在 Swift 中无法运行。谁能告诉我如何解决这个错误?

【问题讨论】:

  • 为什么它适用于 ObjC 而不是 Swift:Swift 在数值运算上更加冗长和严格,而 ObjC 则不是

标签: swift double


【解决方案1】:
    var lowPassReslts: Double = 0.0
    var lowPassReslts1: Double = 0.0

    let ALPHA: Float = 1.05

    let averagePowerForChannel = pow(10, (0.05 * audioPlayer.averagePower(forChannel: 0)))
    lowPassReslts = Double(ALPHA * Float(averagePowerForChannel) + (1.0 - ALPHA) * Float(lowPassReslts))

    let averagePowerForChannel1 = pow(10, (0.05 * audioPlayer.averagePower(forChannel: 1)))
    lowPassReslts1 = Double(ALPHA * Float(averagePowerForChannel1) + (1.0 - ALPHA) * Float(lowPassReslts1))

【讨论】:

  • Swift 更喜欢 Double 而不是 Float,因此最好将 ALPHA 设置为 double,而不是进行几次从 double 到 float 的转换来解决问题。
【解决方案2】:

Pow(Double, Double) 它接受双精度并返回双精度。

let ALPHA: Float = 1.05,您明确声明了 Float(更改命名约定,不应该全部大写)。

在 swift 中,您不能对两种不同类型进行任何二进制操作。

解决方法:将 alpha 类型更改为 double 或不声明数据类型,否则在操作过程中将其转换为 double。

【讨论】:

    【解决方案3】:

    您需要为两者设置相同的数据类型,例如两者都是双精度或浮点数。

    【讨论】:

      【解决方案4】:

      与目标 C 不同,您不能对 2 种不同类型的变量进行操作(因为 Swift 语言是类型安全的)。

      要进行任何算术计算,两个操作数的类型必须相同。

      如果你没有指定变量的类型,那么 swift 从它的值推断类型。

      例如。

      let a = 10    //Swift consider it -> Int type 
      let b = 20.0  //Swift consider it -> Double type 
      
      let result = a * b  //Gives compile time error for the operand type 
      
      let result = Double(a) * b  //No error, as Int is converted to Double
      

      【讨论】:

        【解决方案5】:

        将 ALPHA 的参数类型设置为 Double 或将 lowPassReslts 更改为 Float

        试试下面的代码:

        var lowPassReslts: Double = 0.0
        var lowPassReslts1: Double = 0.0
        
        let ALPHA: Double = 1.05
        
        let averagePowerForChannel = pow(10, (0.05 * audioPlayer.averagePower(forChannel: 0)))
        lowPassReslts = ALPHA * averagePowerForChannel + (1.0 - ALPHA) * lowPassReslts 
        
        let averagePowerForChannel1 = pow(10, (0.05 * audioPlayer.averagePower(forChannel: 1)))
        lowPassReslts1 = ALPHA * averagePowerForChannel1 + (1.0 - ALPHA) * lowPassReslts1
        

        在swift中不需要声明变量类型。您可以直接将变量声明为,

          var lowPassReslts = 0.0
          var lowPassReslts1 = 0.0
          let ALPHA = 1.05
        

        尝试以上任何一种方法。希望对你有帮助。

        【讨论】:

          猜你喜欢
          • 2019-08-23
          • 2015-08-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-27
          相关资源
          最近更新 更多