Бинарный оператор «*» не может применяться к операндам типа «Float» и «Double»

Я реализую 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. Может ли кто-нибудь сказать мне, как решить эту ошибку?

Бинарный оператор «*» не может применяться к операндам типа «Float» и «Double»

О том, почему это работает на ObjC, а не на Swift: Swift более многословен и строг в числовых операциях, а ObjC — нет.

Joshua Francis Roman 29.05.2019 07:32
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
770
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

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

В отличие от цели 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, чтобы решить проблему.

Rubiya Faniband 29.05.2019 14:34

Pow(Double, Double) принимает значение double и возвращает значение double.

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

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

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

Другие вопросы по теме