Загрузить файл XML из основного пакета в Swift 3.0

У меня есть файл.GPX, содержащий информацию о маршруте похода, который я хочу загрузить в свое приложение. Все в порядке, если я загружаю его с удаленного URL ( https://dl.dropboxusercontent.com/u/45741304/appsettings/Phu_si_Lung_05_01_14.gpx), но я не могу загрузить этот же файл из комплекта приложения (уже в разделе "Копировать ресурсы комплекта" "и имел правильное целевое членство).

Вот мой код для загрузки этого файла с удаленного URL:

var xmlParser: XMLParser!


func startParsingFileFromURL(urlString: String) {
    guard let url = URL(string: urlString) else {
        print("Can't load URL: \(urlString)")
        return
    }
    self.xmlParser = XMLParser(contentsOf: url)
    self.xmlParser.delegate = self
    let result = self.xmlParser.parse()
    print("parse from URL result: \(result)")
    if result == false {
        print(xmlParser.parserError?.localizedDescription)
    }

}

и из основного комплекта:

func startParsingFile(fileName: String, fileType: String) {
    guard let urlPath = Bundle.main.path(forResource: fileName, ofType: fileType) else {
        print("Can't load file \(fileName).\(fileType)")
        return
    }
    guard let url:URL = URL(string: urlPath) else {
        print("Error on create URL to read file")
        return
    }
    self.xmlParser = XMLParser(contentsOf: url)
    self.xmlParser.delegate = self
    let result = self.xmlParser.parse()
    print("parse from file result: \(result)")
    if result == false {
        print(xmlParser.parserError?.localizedDescription)
    }
}

Ошибка при загрузке из комплекта приложения:

parse from file result: false
Optional("The operation couldn’t be completed. (Cocoa error -1.)")

1 ответ

Решение

Ты говоришь:

guard let urlPath = Bundle.main.path(forResource: fileName, ofType: fileType) else {
    print("Can't load file \(fileName).\(fileType)")
    return
}
guard let url:URL = URL(string: urlPath) else {
    print("Error on create URL to read file")
    return
}

Во-первых, очень глупо превращать строковый путь в URL. Вы знали, что хотите URL, так почему вы не начали с вызова url(forResource:...)?

Во-вторых, если вы когда-нибудь превратите путь строки в URL, вы должны создать файл URL.

Другие вопросы по тегам