Ich versuche, einen einfachen IO - Wrapper für Swift zu schreiben.
Um dies zu testen, habe ich eine Datei namens "Test.txt" in meinem Projektstamm.
Ich habe diese Datei zu Build-Phasen in Build-Bundle-Ressourcen hinzugefügt, wie von allen anderen vorgeschlagen, die dieses Problem hatten.
Ich habe eine sehr einfache File-Klasse mit einer Lesefunktion implementiert, um den Inhalt der Datei auszugeben.
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)!
}
}
Wenn ich den Inhalt des Bundles drucke, bekomme ich eine URI an einen bestimmten Ort in meinem Dateisystem. Ich nehme an, es handelt sich um den virtuellen Ort der App im Simulator. Beim Navigieren darauf wird deutlich, dass es tatsächlich meine "Test.txt" -Datei enthält.
Jetzt möchte ich nur noch den Pfad zu dieser Datei erhalten.
Ich mache das, indem ich anrufe: self.bundle.pathForResource("Test.txt", ofType: "txt")
Dies gibt "Null" zurück
Warum? :)
Fügen Sie den .txt
nicht in den Parameter name ein, sondern übergeben Sie ihn als Parameter extension.
Aus der Dokumentation :
Erweiterung
Die Dateinamenerweiterung der zu lokalisierenden Datei.
Wenn Sie eine leere Zeichenfolge oder Null angeben, wird davon ausgegangen, dass die Erweiterung nicht vorhanden ist. Die Datei ist die erste gefundene Datei, die genau mit dem Namen übereinstimmt.
let bundle = Bundle.main
let path = bundle.path(forResource: "Test", ofType: "txt")
let bundle = NSBundle.mainBundle()
let path = self.bundle.pathForResource("Test", ofType: "txt")
NSBundle* bundle = [NSBundle mainBundle];
NSString* path = [bundle pathForResource:@"Test" ofType:@"txt"];
In Swift 3.0 schreiben Sie mit
let path = Bundle.main.path(forResource: "Test", ofType: "txt")
Ersetzen Sie Ihre
let path = self.bundle.pathForResource("Test.txt", ofType: "txt")
mit
let path = NSBundle.mainBundle().pathForResource("Test", ofType: "txt")
Ersetzen
let path = self.bundle.pathForResource("Test.txt", ofType: "txt")
mit
let path = self.bundle.pathForResource("Test", ofType: "txt")
Für diejenigen von Ihnen, die versuchen, auf Ressourcen in Komponententests zuzugreifen, war ich mit einem Problem konfrontiert, bei dem die Ressource nicht im Hauptpaket gefunden wurde und meine Lösung darin bestand, den Pfad in allen Bündeln zu suchen. Auf diese Weise muss ich nicht angeben ein Bündelbezeichner, wobei fileName
eine Zeichenfolge ist, die an die Funktion übergeben wird, und natürlich kann der Typ beliebig sein.
NSString *path;
for (NSBundle *bundle in [NSBundle allBundles]) {
path = [bundle pathForResource:fileName ofType:@"json"];
if (path) {
break;
}
}
Ein weiterer Grund für NSBundle.mainBundle (). PathForResource gibt zurück, dass die Datei nicht ordnungsgemäß zum Ziel hinzugefügt wurde. Stellen Sie beim Ziehen und Ablegen der Datei im Bundle sicher, dass das Kontrollkästchen "Zum Ziel hinzufügen" und das Kontrollkästchen "Elemente bei Bedarf kopieren" aktiviert ist.
Der Parameter ofType wurde an den Ressourcennamen angehängt. Ersetzen Sie daher diese Zeile:
let path = self.bundle.pathForResource("Test.txt", ofType: "txt")
zu so etwas:
let path = self.bundle.pathForResource("Test", ofType: "txt")
Die Build-Bundle-Ressourcen müssen ebenfalls geprüft werden.