在我的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'接受提供的参数
答案 0 :(得分:4)
编辑(有人向我指出,何时使用NSErrorPointer和何时使用NSError有明显区别?这是官方用语:
从“使用Swift与Cocoa和Objective-C。”
“当您需要报告错误原因时,可以向函数添加NSErrorPointer类型的NSError out参数。这种类型大致相当于Objective-C的NSError **,具有额外的内存安全性和可选的输入。你可以使用前缀&运算符将对可选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< NSError?>'。这是因为该方法试图通过引用接收错误,因此它可以“回写”到您的本地变量。 In Obj-C这看起来像(NSError **)
。 (有趣的事实:AutoreleasingUnsafePointer<NSError?>
在Swift中别名为NSErrorPointer
。)
实际上,如果您点击AVAudioPlayer查看其声明,您会发现init方法定义为
init(contentsOfURL url: NSURL!, error outError: AutoreleasingUnsafePointer<NSError?>)
出于这个原因,你必须:
使用NSError?
(即Optional<NSError>
)变量,因为错误可能是nil
。
通过引用将错误传递给前缀&
运算符。
var error: NSError?
...
audioPlayer = AVAudioPlayer(contentsOfURL: audioFileLocationUrl, error: &error)
有关详细信息,请参阅“使用Swift with Cocoa和Objective-C”中的Error Reporting。