'(NSObject) -> () -> ViewController()' 不符合预期类型 'classDelegate'
'(NSObject) -> () -> ViewController()' does not conform to expected type 'classDelegate'
我是 OO/mobile 编程的新手,我正在制作一个可以进行声音分析的应用程序(试图尽快推出调谐器应用程序)。
有时我对 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()
这部分代码启动 class 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() 中,我尝试从 ViewController 此处调用一个函数:
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)")
}
}
从面向对象的角度来看,这是非常错误的吗?或者我忘记了什么?
我的意思是..从 'father' class 中调用函数...似乎不是最好的 OO 方式,但这是我看到的唯一方式。
如果需要,您可以在此处查看项目:
https://github.com/denisb411/Microphone_Analyser_AK
提前致谢。
已使用 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()
}
我是 OO/mobile 编程的新手,我正在制作一个可以进行声音分析的应用程序(试图尽快推出调谐器应用程序)。
有时我对 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()
这部分代码启动 class 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() 中,我尝试从 ViewController 此处调用一个函数:
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)")
}
}
从面向对象的角度来看,这是非常错误的吗?或者我忘记了什么?
我的意思是..从 'father' class 中调用函数...似乎不是最好的 OO 方式,但这是我看到的唯一方式。
如果需要,您可以在此处查看项目:
https://github.com/denisb411/Microphone_Analyser_AK
提前致谢。
已使用 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()
}