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

时间:2019-05-29 05:23:35

标签: swift double

我正在实现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中则不能。谁能告诉我如何解决此错误?

Please See Screen Shot

5 个答案:

答案 0 :(得分: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))

答案 1 :(得分:0)

您需要为两个数据类型设置相同的数据类型,例如两者都是double或都为float。

答案 2 :(得分:0)

将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

很快就不需要声明变量类型了。您可以直接将变量声明为

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

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

答案 3 :(得分:0)

与目标C不同,您无法对2种不同类型的变量进行操作(因为 Swift Language是Type-Safe )。

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

  

如果您未指定变量的类型,则迅速从其值中推断出类型。

例如。

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

答案 4 :(得分:0)

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

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

快速地,您不能使用两种不同的类型执行任何二进制操作。

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