Двоичный оператор '*' нельзя применять к операндам типа 'Float' и 'Double' - PullRequest
0 голосов
/ 29 мая 2019

Я использую 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 ]

1 голос
/ 29 мая 2019
    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))
0 голосов
/ 29 мая 2019

Пау (Двойной, Двойной) принимает двойное и возвращает двойное.

let ALPHA: Float = 1.05, вы явно объявили Float (измените соглашение об именах, не должны быть все заглавные буквы).

в swift вы не можете выполнять никакие двоичные операции с двумя различными типами.

Решение: измените альфа-тип на double или не объявляйте тип данных, иначе преобразуйте его в double во время работы.

0 голосов
/ 29 мая 2019

Задайте тип параметра 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

Попробуйте любой из вышеперечисленных методов. Надеюсь, это поможет вам.

0 голосов
/ 29 мая 2019

В отличие от цели C, вы не можете выполнять операции с переменными 2-го типа (например, Язык 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
0 голосов
/ 29 мая 2019

Вам нужно сделать один и тот же тип данных для обоих, так как оба типа double или оба типа float.

...