无法将typesPFFile的值转换为NSURL

我正尝试使用Xcode 7中的Swift 2.0来parsing音乐(我有3个audio文件,我在Parse中上传)。 我一直在关注6个月前出来的一个教程,但显然有很多改变。 我已经能够符合除了一个之外的所有变化。 当我运行应用程序,并点击一排(这是一首歌)我得到的错误:

无法将types“PFFile”(0x10dda2d50)的值转换为“NSURL”(0x10e6d1c10)。

这是我的代码:

import UIKit import Parse import AVFoundation import AVKit public var AudioPlayer = AVPlayer() public var SelectedSongNumber = Int() class TableViewController: UITableViewController, AVAudioPlayerDelegate { var iDArray = [String]() var NameArray = [String]() override func viewDidLoad() { super.viewDidLoad() var ObjectIDQuery = PFQuery(className: "Songs") ObjectIDQuery.findObjectsInBackgroundWithBlock { (objectsArray: [PFObject]?, error: NSError?) -> Void in //objectsArray!.count != 0 var objectIDs = objectsArray! NSLog("\(objectIDs)") for i in 0...objectIDs.count-1 { self.iDArray.append(objectIDs[i].valueForKey("objectId") as! String) self.NameArray.append(objectIDs[i].valueForKey("SongName") as! String) self.tableView.reloadData() } } } func grabSong () { var songQuery = PFQuery(className: "Songs") songQuery.getObjectInBackgroundWithId(iDArray[SelectedSongNumber], block: { (object: PFObject?, error : NSError?) -> Void in if let AudioFileURLTemporary = object?.objectForKey("SongFile") { AudioPlayer = AVPlayer(URL: AudioFileURLTemporary as! NSURL) AudioPlayer.play() } }) } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return iDArray.count } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var cell = tableView.dequeueReusableCellWithIdentifier("Cell") cell?.textLabel!.text = NameArray[indexPath.row] return cell! } override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { SelectedSongNumber = indexPath.row grabSong() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } 

给我麻烦的一行是AudioPlayer = AVPlayer(URL: AudioFileURLTemporary as! NSURL) 。 本来教程有这样的行写成AudioPlayer = AVPlayer(URL: NSURL(string: AudioFileURLTemporary!))但也不起作用。

我如何解决这个问题?

PFFiles与NSURL不在同一个类层次结构中,所以它们不能被转换为NSURL。 相反,您需要从PFFile的url属性中获取urlstring:

 func grabSong () { var songQuery = PFQuery(className: "Songs") songQuery.getObjectInBackgroundWithId(iDArray[SelectedSongNumber], block: { (object: PFObject?, error : NSError?) -> Void in if let audioFile = object?["SongFile"] as? PFFile { let audioFileUrlString: String = audioFile.url //This might be actually be a String?, I don't remember. let audioFileUrl = NSURL(string: audioFileUrlString)! AudioPlayer = AVPlayer(URL: audioFileUrl) AudioPlayer.play() } }) }