Невозможно преобразовать значение типа «URL» в ожидаемый тип аргумента «String» - PullRequest
0 голосов
/ 29 марта 2019

Я довольно новичок в Swift и пытаюсь сохранить видео в папку с документами после записи (чтобы потом загрузить на сервер), но у меня появляется вышеуказанная ошибка. Я понимаю, что говорит ошибка, но я не уверен, как это исправить. Я получил код ниже из другого ответа на стек. Что мне не хватает?

Сборка завершается неудачно в этой строке:

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)

}

1 Ответ

0 голосов
/ 29 марта 2019

Просто используйте метод данных write(to: URL) вместо write(foFile: String) или передайте свойство пути URL.Кстати, именование URL dataPath вводит в заблуждение.Измените его на 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)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...