2017-01-07 3 views
0

Эта ассоциация в строке 5 не способствует успеху приложения. Но я честно не понимаю, что происходит в этот момент.Невозможно вызвать инициализатор для типа 'UnsafeMutablePointer <Float>' с списком аргументов типа (UnsafeMutableRawPointer!) '

Перегрузки для ÜnsafeMutablePointer существуют с частично сопоставимым списком параметров: (RawPointer).

Но что это значит? Спасибо

override func buffer(withCsound cs: CsoundObj) -> Data { 
      let length = Int(AKSettings.shared().numberOfChannels) * 
          Int(AKSettings.shared().samplesPerControlPeriod) * 4 
      let num  = length/4 
      let floats = UnsafeMutablePointer<Float>(malloc(length)) 

      /* The phase and amplitude are different for each line to get a nice 
      * gimmick. */ 
      let phase  = (self.amplifier + 0.8)/1.8 

      for i in 0 ... num - 1 { 
       /* The amplitude is placed within the for-loop because it can fade 
       * to a slightly different value during one plot refresh. */ 
       let amplitude = self.amplifier * self.amplitude 

       /* It is incredibly important that `time` and `phase` aren't 
       * multiplied with the frequency or else it will bump at each 
       * frequency change. */ 
       var t = (time + Double(i)/Double(num) * self.frequency + phase) 

       floats[i] = Float(sin(t * 2 * 3.14)) 

       /* It is multiplied with a "regular" 0.5 Hz sine to get both ends 
       * to fade out nicely. It's sort of a simplistic window function. */ 
       t = Double(i)/Double(num) 
       floats[i] *= Float(sin(t * 1 * 3.14) * amplitude) 
       floats[i] *= 1 - pow(1 - Float(i)/Float(num), 2.0) 

       time += self.frequency/44100/2 

       /* Fade smoothly to the next frequency and amplitude. */ 
       self.frequency += (nextFrequency - self.frequency)/44100.0/4.0 
       self.amplitude += (nextAmplitude - self.amplitude)/44100.0/2.0 
      } 

      /* We keep the time between 0 and 1 to make sure it never overflows/
      * loses the necessary precision. */ 
      time = fmod(time, 1.0) 

      return Data(bytesNoCopy: UnsafeMutablePointer<UInt8>(floats), count: length, deallocator: .free) 
     } 

ответ

0

Вы можете найти похожие статьи, поиск с помощью сообщения об ошибке.

Например: How to use UnsafeMutablePointer in Swift 3?

А вы бы лучше прочитать MIGRATING TO SWIFT 3, особенно this article.


Для конкретного случая.

Изменить эту строку:

let floats = UnsafeMutablePointer<Float>(malloc(length)) 

к:

let rawBytes = malloc(length)! 
let floats = rawBytes.assumingMemoryBound(to: Float.self) 

И измените последнюю строку:

return Data(bytesNoCopy: UnsafeMutablePointer<UInt8>(floats), count: length, deallocator: .free) 

к:

return Data(bytesNoCopy: rawBytes, count: length, deallocator: .free) 

Вариант 2.

Изменение линии let floats = UnsafeMutablePointer<Float>(malloc(length)) к:

var data = Data(count: length) 
data.withUnsafeMutableBytes {(floats: UnsafeMutablePointer<Float>) in 

И измените последнюю строку на:

} 
return data 

(Все линии между ними заключаются в закрытии {(floats: UnsafeMutablePointer<Float>) in ...} .)

+0

Привет, OOper, теперь все понятнее. И работает. Спасибо за номинации. Увидимся. –

Смежные вопросы