AVAudioSession的Swift子类在运行时不工作

时间:2017-05-10 13:22:23

标签: ios objective-c swift

我有一个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'的实例,这就是为什么存在无法识别的选择器异常。

为什么会发生这种情况,任何人都可以提供线索吗?

1 个答案:

答案 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