首页 > 解决方案 > 无法将“URL”类型的值转换为预期的参数类型“字符串”

问题描述

我对 Swift 还很陌生,我正在尝试在录制视频后将视频保存到文档文件夹中(这样我就可以上传到服务器),但我遇到了上述错误。我明白错误在说什么,但我不知道如何解决它。我从 Stack 上的另一个答案中得到了下面的代码。我错过了什么?

构建在此行失败:

videoData?.write(toFile: dataPath, atomically: false)

完整的功能是:

func getDocumentsDirectory() -> URL {
    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    let documentsDirectory = paths[0]
    return documentsDirectory
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]){

    let videoURL = info[UIImagePickerController.InfoKey.mediaURL] as! NSURL
    let videoData = NSData(contentsOf: videoURL as URL)
    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    let docsDirectory = getDocumentsDirectory()
    let dataPath = docsDirectory.appendingPathComponent("/videoFileName.mp4")

    videoData?.write(toFile: dataPath, atomically: false)

    self.dismiss(animated: true, completion: nil)

}

标签: swiftxcodevideo

解决方案


只需使用 data 方法write(to: URL)而不是write(foFile: String)或传递URLpath 属性。顺便说一句,命名URLdataPath 具有误导性。将其更改为fileURL并传递其路径fileURL.path,但最好尽可能使用URL对应的方法。同样正如@vadian 在评论中已经提到的那样,在附加路径组件时,不需要转换NSURL和返回,也不需要传递前导斜杠。URL这同样适用于NSData,您应该尽可能删除NS前缀。Swift 本机类型是Data.

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]){
    if let videoURL = info[.mediaURL] as? URL {
        do {
            let videoData = try Data(contentsOf: videoURL)
            let fileURL = documentsDirectory.appendingPathComponent("videoFileName.mp4")
            try videoData.write(to: fileURL)
            // pass atomic options if you would like to automatically override any existing file if needed
            // try videoData.write(to: fileURL, options: .atomic)
        } catch {
            print(error)
        }
        dismiss(animated: true)
    }
}

推荐阅读