Я реализую AudioVisualizer
и пытаюсь рассчитать время звука, но получаю сообщение об ошибке ниже
Binary operator '*' cannot be applied to operands of type 'Float' and '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. Может ли кто-нибудь сказать мне, как решить эту ошибку?
Вам нужно сделать один и тот же тип данных для обоих, например, оба являются двойными или оба являются плавающими.
Сделайте тип параметра 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
Попробуйте любой из вышеперечисленных способов. Надеюсь, это поможет вам.
В отличие от цели C, вы не можете выполнять операции с двумя переменными разных типов (как Язык Swift безопасен для типов).
Для выполнения любых арифметических вычислений тип обоих операндов должен быть одинаковым.
If you do not specify the type of the variable then swift inferences the type from its value.
Например.
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
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, чтобы решить проблему.
Pow(Double, Double) принимает значение double и возвращает значение double.
пусть ALPHA: Float = 1,05, вы явно объявили Float (измените соглашение об именах, не должно быть всех заглавных букв).
в swift вы не можете выполнять бинарные операции с двумя разными типами.
Решение: измените тип alpha на double или не объявляйте тип данных, иначе преобразуйте его в double во время работы.
О том, почему это работает на ObjC, а не на Swift: Swift более многословен и строг в числовых операциях, а ObjC — нет.