我有一个AVAudioSession的Swift子类:
// AudioSession.swift
class AudioSession: AVAudioSession
我有一些方法,例如:
func setToSpeaker() throws {
...
}
现在,当我从objC类调用此方法时:
[[AudioSession sharedInstance] setToSpeakerAndReturnError: nil];
这编译得很好,似乎编译器拥有关于swift类作为AVAudioSession的子类的所有必要信息,因为我还能够在其上调用超类方法,如:
[[AudioSession shared] setActive: true error: nil];
但是当我运行它时,程序在调用此子类的任何方法时崩溃,错误:
' - [AVAudioSession setToSpeakerAndReturnError:]:无法识别的选择器发送到实例0x170008510'
我在调试器中进一步查看并发现在运行时,我的子类'AudioSession'的任何实例都被视为'AVAudioSession'的实例,这就是为什么存在无法识别的选择器异常。
为什么会发生这种情况,任何人都可以提供线索吗?
答案 0 :(得分:0)
因为我看不到setToSpeaker函数中的代码如何启动AudioEngine或者标记为throws的内容。例如audioEngine.start()可以抛出,你已经标记了你的setToSpeaker函数也抛出尝试用fileprivate标记你的函数
fileprivate func setToSpeaker() throws {
.....
// here if your using the do try and catch for your audioEngine.start()
// now you can simply start the audio engine
audioEngine.start()
}
由于你的函数可以扔掉,你必须使用try-catch in objective-C
@try {
[[AudioSession sharedInstance] setToSpeaker];
}
@catch (NSException *exception) {
NSLog(@"Something missing...");
}
@finally {
}
或者不要在swift文件中使用throws标记你的函数
func setToSpeaker() {
do {
try audioEngine.start()
} catch {
// if audioEngine throws now just printing the localized string
print(error.localizedDescription)
}
}
直接从Objective-C打电话不需要@try和@catch