'NSError'无法转换为'AutoreleasingUnsafePointer <nserror?>'</nserror?>

时间:2014-07-09 06:16:58

标签: error-handling swift avaudioplayer

在我的iOS应用程序中,我需要播放声音。我有以下代码:

var audioFileLocationUrl = NSBundle.mainBundle().pathForResource("midnight", ofType: "m4a")
var error: NSError
var audioPlayer = AVAudioPlayer()
audioPlayer = AVAudioPlayer(contentsOfURL: audioFileLocationUrl, error: error)
audioPlayer.prepareToPlay()

在线:

audioPlayer = AVAudioPlayer(contentsOfURL: audioFileLocationUrl, error: error)

我有错误:无法找到&#39; init&#39;接受提供的参数

3 个答案:

答案 0 :(得分:4)

编辑(有人向我指出,何时使用NSErrorPointer和何时使用NSError有明显区别?这是官方用语:

从“使用Swift与Cocoa和Objective-C。”

“当您需要报告错误原因时,可以向函数添加NSErrorPointer类型的NSError out参数。这种类型大致相当于Objective-C的NSError **,具有额外的内存安全性和可选的输入。你可以使用前缀&amp;运算符将对可选NSError类型的引用作为NSErrorPointer对象传递,如下面的代码清单所示。

var writeError : NSError? 
AVAudioPlayer(contentsOfURL: audioFileLocationUrl, error: &writeError)

答案 1 :(得分:1)

尝试

var error :NSError?

audioPlayer = AVAudioPlayer(contentsOfURL: audioFileLocationUrl, error: &error)

未通过检查您正在调用正确的方法并传入正确的对象类型。

您收到此警告的原因是编译器无法使用这些参数找到该init方法。

答案 2 :(得分:0)

更新:Swift 2中的错误处理发生了巨大变化。有关最新信息,请参阅the documentation


对我来说,此代码会产生错误'NSError'无法转换为'AutoreleasingUnsafePointer&lt; NSError?&gt;'。这是因为该方法试图通过引用接收错误,因此它可以“回写”到您的本地变量。 In Obj-C这看起来像(NSError **)。 (有趣的事实:AutoreleasingUnsafePointer<NSError?>在Swift中别名为NSErrorPointer。)

实际上,如果您点击AVAudioPlayer查看其声明,您会发现init方法定义为

init(contentsOfURL url: NSURL!, error outError: AutoreleasingUnsafePointer<NSError?>)

出于这个原因,你必须:

  1. 使用NSError?(即Optional<NSError>)变量,因为错误可能是nil

  2. 通过引用将错误传递给前缀&运算符。

    var error: NSError?
    ...
    audioPlayer = AVAudioPlayer(contentsOfURL: audioFileLocationUrl, error: &error)
    
  3. 有关详细信息,请参阅“使用Swift with Cocoa和Objective-C”中的Error Reporting