Error handling ';n错误';不可转换为';自动释放安全指针<;n错误?>';

Error handling ';n错误';不可转换为';自动释放安全指针<;n错误?>';,error-handling,swift,avaudioplayer,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

在我的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)
我有错误:找不到接受提供的参数的'init'的重载

var error :NSError?

audioPlayer = AVAudioPlayer(contentsOfURL: audioFileLocationUrl, error: &error)
如果检查失败,则调用了正确的方法并传入了正确的对象类型


出现此警告的原因是编译器找不到具有这些参数的init方法。

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


对我来说,这段代码会产生错误。'NSError'不能转换为'autoreleasingusafepointer'。这是因为该方法试图通过引用获取错误,以便可以“写回”局部变量。这看起来像
(n错误**)
。(有趣的事实:
autoreleasingusafepointer
在Swift中别名为
NSErrorPointer

事实上,如果你⌘-单击AVAudioPlayer查看其声明,您会发现init方法定义为

init(contentsOfURL url: NSURL!, error outError: AutoreleasingUnsafePointer<NSError?>)
有关更多信息,请参阅“将Swift与Cocoa和Objective-C结合使用”中的内容。

编辑(有人向我指出,何时使用NSErrorInter与何时使用NSError?之间存在明显差异。以下是官方用语:

来自“将Swift与Cocoa和Objective-C结合使用”

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

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

这是错误的;
NSError
是您想要保留的,因此您的局部变量应该是
NSError?
。前缀
&
操作符将为您执行指针部分。此外,您将可选值声明为
nil
,并立即将其展开,这是一个错误。看到您是对的!我学到了一些东西今天我在打电话。我现在已经把答案改成了正确答案。你是什么意思?
error
可能是零(因为它是
NSError?
),但它必须是
NSError&
,这样你就可以通过
error:&error
。我的意思是audioPlayer=AVAudioPlayer(contentsOfURL:audioFileLocationUrl,error:nil)audioFileLocationUrl是URL还是字符串,怀疑它可能是字符串?
var writeError : NSError? 
AVAudioPlayer(contentsOfURL: audioFileLocationUrl, error: &writeError)