NSBundle.mainBundle(). PathForResource возвращает nil
Я пытаюсь написать простую оболочку IO для Swift.
Чтобы проверить это, у меня есть файл с именем Test.txt в корне моего проекта.
Я добавил этот файл для создания фаз в составе Bundle Resources, как это было предложено всеми, у кого была эта проблема.
![Build Bundle Resources]()
Я реализовал очень простой класс File с одной функцией чтения с намерением вывести содержимое файла.
class File2{
let resourceName: String
let type: String
let bundle = NSBundle.mainBundle()
init(resourceName: String, type: String = "txt"){
self.resourceName = resourceName
self.type = type
println(self.bundle)
}
func read(){
let path = self.bundle.pathForResource("Test.txt", ofType: "txt") //Hard coded these in just to make sure Strings contained no whitespace
println(path) //This returns nil...why?
var error:NSError?
//print(String(contentsOfFile:path!, encoding:NSUTF8StringEncoding, error: &error)!)
//return String(contentsOfFile:path!, encoding:NSUTF8StringEncoding, error: &error)!
}
}
Когда я печатаю содержимое пакета, я получаю URI в определенное место в своей файловой системе, которое, я полагаю, является виртуальным расположением приложения в симуляторе. Навигация к нему показывает, что он действительно содержит мой файл "Test.txt".
Теперь все, что я хочу сделать, это получить путь к этому файлу.
Я делаю это, вызывая: self.bundle.pathForResource("Test.txt", ofType: "txt")
Это возвращает "nil"
Почему?:)
Ответы
Ответ 1
Не включайте .txt
в параметр имя, передайте его как параметр extension.
Из документации:
расширение
Расширение файла файла для поиска.
Если вы укажете пустую строку или nil, предполагается, что расширение не существует, и файл является первым найденным файлом, который точно соответствует имени.
Swift3
let bundle = Bundle.main
let path = bundle.path(forResource: "Test", ofType: "txt")
Swift1 и Swift2
let bundle = NSBundle.mainBundle()
let path = self.bundle.pathForResource("Test", ofType: "txt")
Objective-C
NSBundle* bundle = [NSBundle mainBundle];
NSString* path = [bundle pathForResource:@"Test" ofType:@"txt"];
Ответ 2
В swift 3.0 напишите с помощью
let path = Bundle.main.path(forResource: "Test", ofType: "txt")
Ответ 3
Замените
let path = self.bundle.pathForResource("Test.txt", ofType: "txt")
с
let path = NSBundle.mainBundle().pathForResource("Test", ofType: "txt")
Ответ 4
Заменить
let path = self.bundle.pathForResource("Test.txt", ofType: "txt")
с
let path = self.bundle.pathForResource("Test", ofType: "txt")
Ответ 5
Параметр ofType добавлен к имени ресурса, поэтому замените эту строку:
let path = self.bundle.pathForResource("Test.txt", ofType: "txt")
примерно так:
let path = self.bundle.pathForResource("Test", ofType: "txt")
Для проверки также требуется Ресурсы компоновки компоновки.
Ответ 6
Еще одна причина для NSBundle.mainBundle(). pathForResource возвращает nil, файл не добавляется к цели целиком. Когда вы перетаскиваете файл в комплекте, убедитесь, что установлен флажок "Добавить в цель" и флажок "Копировать элементы при необходимости".