2017-03-08 34 views
1

我是OO /移動編程的新手,我正在製作一個應用程序來進行聲音分析一個調諧器應用程序即將)。'(NSObject) - >() - > ViewController()'不符合期望的類型'classDelegate'

有時候我有點困惑於OO,不能否認它。 正如小標題所說,我得到了這個錯誤,不知道爲什麼。讓我們看代碼ViewController():

import UIKit 
    import AudioKit 

    class ViewController: UIViewController, SoundAnalyserDelegate{ 

     let soundAnalyser = SoundAnalyser(delegate: self) //getting error here 



     @IBOutlet var frequencyLabel: UILabel! 
     @IBOutlet var amplitudeLabel: UILabel! 
     @IBOutlet var note: UILabel! 

     override func viewDidLoad() { 
      super.viewDidLoad() 

      soundAnalyser.start() 

這部分代碼啓動SoundAnalyser類並委託自己。

看SoundAnalyser代碼:

class SoundAnalyser { 

     var delegate:SoundAnalyserDelegate? 

     let minimum = Double(160) 
     let maximum = Double(1400) 

     var mic: AKMicrophone 
     var tracker: AKFrequencyTracker 
     fileprivate var silence: AKBooster 
     fileprivate var timer: Timer? 
     fileprivate var notesArray: [(String, Double)]? 

     init(delegate: SoundAnalyserDelegate){ 
      mic = AKMicrophone() 
      tracker = AKFrequencyTracker(mic, hopSize: minimum, peakCount: maximum) 
      silence = AKBooster(tracker, gain:0) 
      notesArray = self.getNotesFrequencies() 
      self.delegate = delegate 

     } 


     func start(){ 
      AudioKit.output = silence   

在SoundAnalyser(),我嘗試從視圖控制器這裏調用一個函數:

 func tick(){ 
      let amp = tracker.amplitude 
      let freq = tracker.frequency 


      if amp > 0.05 && freq > minimum && freq < maximum{ 
       let readNote = notesArray![analyseCapturedSound()] 

       delegate?.setLabelAmp(String(format:"%f", amp)) //Setting the text of a label from the UI 

       delegate?.setLabelFreq(String(format:"%f", freq)) 

    //   delegate?.setLabelNote(String(format:"%f", readNote)) 

       print("freq:", freq," amp:", amp," NOTE: \(readNote)") 
      } 
     }   

這是非常錯誤的觀點OO點?或者我忘記了什麼?

我的意思是說,從'父親'類中調用func ...似乎並不是最好的面向對象的方式,但它是唯一我看到要做到的。

如果需要,您可以在這裏檢查項目:

https://github.com/denisb411/Microphone_Analyser_AK

在此先感謝。

+0

呼叫委託'soundAnalyser.delegate = self' –

+0

您可以使用'lazy'屬性 - 例如參見http://stackoverflow.com/q/36996573/2976878 – Hamish

回答

1

lazy var初始化您的對象。

class ViewController: UIViewController, SoundAnalyserDelegate{ 

    lazy var fontSize : SoundAnalyser = { 
     return SoundAnalyser(delegate: self) 
    }() 

    @IBOutlet var frequencyLabel: UILabel! 
    @IBOutlet var amplitudeLabel: UILabel! 
    @IBOutlet var note: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     soundAnalyser.start() 

    } 
+2

能否請您解釋一下爲什麼和你如何得出這個結論? –

+0

我已經做了一些小的修改,使代碼可編譯,但我可能會更喜歡使用IUO或懶惰屬性。 – Sulthan

+0

@Sulthan感謝您的編輯。 –

相關問題