Подтвердить что ты не робот

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"

Почему?:)

4b9b3361

Ответ 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, файл не добавляется к цели целиком. Когда вы перетаскиваете файл в комплекте, убедитесь, что установлен флажок "Добавить в цель" и флажок "Копировать элементы при необходимости".