【问题标题】:'NSError' is not convertible to 'AutoreleasingUnsafePointer<NSError?>''NSError' 不能转换为 'AutoreleasingUnsafePointer<NSError?>'
【发布时间】:2014-07-09 06:16:57
【问题描述】:

在我的 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”的重载

【问题讨论】:

    标签: error-handling swift avaudioplayer


    【解决方案1】:

    编辑(有人向我指出,何时使用 NSErrorPointer 和何时使用 NSError 之间有明显的区别?。这是官方的说法:

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

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

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

    【讨论】:

    • 这是错误的; NSError 是你想要保留的,所以你的局部变量应该是NSError?。前缀 &amp; 运算符将为您完成指针部分。此外,您将可选值声明为nil 并立即将其解包,这是一个错误。见here
    • 你是对的!我今天学到了一些东西。我现在已将答案更改为正确。
    【解决方案2】:

    试试

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

    如果检查失败,您调用了正确的方法并传入了正确的对象类型。

    您收到此警告的原因是编译器找不到带有这些参数的 init 方法。

    【讨论】:

    • audioFileLocationUrl 是 URL 还是字符串,怀疑可能是字符串?
    【解决方案3】:

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


    对我来说,这段代码会产生错误'NSError' is not convertible to 'AutoreleasingUnsafePointer'。这是因为该方法试图通过引用获取错误,因此它可以“写回”到您的局部变量。 In Obj-C 这看起来像 (NSError **)。 (有趣的事实:AutoreleasingUnsafePointer&lt;NSError?&gt; 在 Swift 中别名为 NSErrorPointer。)

    事实上,如果你⌘-点击 AVAudioPlayer 来查看它的声明,你会发现 init 方法被定义为

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

    因此,您必须:

    1. 使用NSError?(即Optional&lt;NSError&gt;)变量,因为错误可能是nil

    2. 使用前缀&amp; 运算符通过引用传递错误。

      var error: NSError?
      ...
      audioPlayer = AVAudioPlayer(contentsOfURL: audioFileLocationUrl, error: &error)
      

    有关更多信息,请参阅“将 Swift 与 Cocoa 和 Objective-C 结合使用”中的 Error Reporting

    【讨论】:

    • 什么意思? error 可能是 nil(因为它是 NSError?)但它必须是 NSError&amp; 以便您可以通过 error: &amp;error
    • 我的意思是 audioPlayer = AVAudioPlayer(contentsOfURL: audioFileLocationUrl, error: nil)
    猜你喜欢
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 2016-01-02
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    相关资源
    最近更新 更多