14

我正在使用 Xcode 7 beta,在迁移到 Swift 2 之后,我遇到了这行代码的一些问题:

let recorder = AVAudioRecorder(URL: soundFileURL, settings: recordSettings as! [String : AnyObject])

我收到一条错误消息,提示“调用可以抛出,但错误不能从全局变量初始化程序中抛出”。我的应用程序依赖于recorder作为全局变量。有没有办法让它保持全球性但解决这些问题?我不需要高级错误处理,我只想让它工作。

4

2 回答 2

25

如果你知道你的函数调用不会抛出异常,你可以调用抛出函数try!来禁用错误传播。请注意,如果实际抛出错误,这将抛出运行时异常。

let recorder = try! AVAudioRecorder(URL: soundFileURL, settings: recordSettings as! [String : AnyObject])

来源:Apple 错误处理文档(禁用错误传播)

于 2015-08-04T23:57:27.840 回答
14

您可以使用 3 种方法来解决此问题。

  • 使用 try 创建可选的 AVAudioRecorder?
  • 如果你知道它会返回 AVRecorder,你可以隐式使用 try!
  • 或者然后使用 try / catch 处理错误

使用尝试?

// notice that it returns AVAudioRecorder?
if let recorder = try? AVAudioRecorder(URL: soundFileURL, settings: recordSettings) { 
    // your code here to use the recorder
}

使用尝试!

// this is implicitly unwrapped and can crash if there is problem with soundFileURL or recordSettings
let recorder = try! AVAudioRecorder(URL: soundFileURL, settings: recordSettings)

试着抓

// The best way to do is to handle the error gracefully using try / catch
do {
    let recorder = try AVAudioRecorder(URL: soundFileURL, settings: recordSettings)
} catch {
    print("Error occurred \(error)")
}
于 2015-06-11T09:24:34.597 回答