Swift 封闭式捕捉并非详尽无遗(录音)

Swift 封闭式捕捉并非详尽无遗(录音),swift,error-handling,audio-recording,avaudiorecorder,Swift,Error Handling,Audio Recording,Avaudiorecorder,我正在设置录音机,但在soundRecorder=try AVAudioRecorder(URL:getFileURL(),settings:recordSettings as![String:AnyObject])上遇到一个错误,由于所包含的捕获并非详尽无遗,因此不会处理从这里抛出的错误 func setUpRecorder() { let recordSettings = [AVFormatIDKey : Int(kAudioFormatAppleLossless), AVEnco

我正在设置录音机,但在
soundRecorder=try AVAudioRecorder(URL:getFileURL(),settings:recordSettings as![String:AnyObject])
上遇到一个错误,由于所包含的捕获并非详尽无遗,因此不会处理从这里抛出的错误

func setUpRecorder() {

    let recordSettings = [AVFormatIDKey : Int(kAudioFormatAppleLossless), AVEncoderAudioQualityKey : AVAudioQuality.Max.rawValue, AVEncoderBitRateKey : 320000, AVNumberOfChannelsKey : 2, AVSampleRateKey : 44100.0 ]

    var error: NSError?

    do {
        //  soundRecorder = try AVAudioRecorder(URL: getFileURL(), settings: recordSettings as [NSObject : AnyObject])
        soundRecorder =  try AVAudioRecorder(URL: getFileURL(), settings: recordSettings as! [String : AnyObject])
    } catch let error1 as NSError {
        error = error1
        soundRecorder = nil
    }

    if let err = error {
        print("AVAudioRecorder error: \(err.localizedDescription)")
    } else {
        soundRecorder.delegate = self
        soundRecorder.prepareToRecord()
    }


}

你可以做几件事

do {
    //  soundRecorder = try AVAudioRecorder(URL: getFileURL(), settings: recordSettings as [NSObject : AnyObject])
        soundRecorder =  try AVAudioRecorder(URL: getFileURL(), settings:     recordSettings as! [String : AnyObject])
    } catch let error1 as NSError {
        error = error1
        soundRecorder = nil
    } catch {
      //Exhaustive catch all.
    }
}
或者你可以这样写

do {
    //  soundRecorder = try AVAudioRecorder(URL: getFileURL(), settings: recordSettings as [NSObject : AnyObject])
    soundRecorder =  try AVAudioRecorder(URL: getFileURL(), settings: recordSettings as! [String : AnyObject])
} catch {
  self.error = error as NSError
  soundRecorder = nil
}

这应该行得通

错误消息具有误导性。A

catch let error1 as NSError
是详尽的,因为所有错误都被桥接到
NSError
自动地

编译器似乎被强制转换弄糊涂了

recordSettings as! [String : AnyObject]
这会导致错误的错误消息。解决方案是创建 首先使用正确类型的设置字典:

let recordSettings: [String: AnyObject] = [
    AVFormatIDKey : Int(kAudioFormatAppleLossless),
    AVEncoderAudioQualityKey : AVAudioQuality.Max.rawValue,
    AVEncoderBitRateKey : 320000,
    AVNumberOfChannelsKey : 2,
    AVSampleRateKey : 44100.0 ]

var error: NSError?
do {
    soundRecorder = try AVAudioRecorder(URL: getFileURL(), settings: recordSettings)
} catch let error1 as NSError  {
    error = error1
    soundRecorder = nil
}