Ich versuche, den Pfad zum Ordner "Dokumente" mit dem folgenden Code abzurufen:
var documentsPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory:0,NSSearchPathDomainMask:0,true)
aber Xcode gibt Fehler: Cannot convert expression's type 'AnyObject[]!' to type 'NSSearchPathDirectory'
Ich versuche zu verstehen, was im Code falsch ist.
ios
swift
nsdocumentdirectory
Ivan R.
quelle
quelle
Antworten:
Anscheinend denkt der Compiler, es sei
NSSearchPathDirectory:0
ein Array, und natürlich erwartet erNSSearchPathDirectory
stattdessen den Typ . Sicher keine hilfreiche Fehlermeldung.Aber zu den Gründen:
Zunächst verwechseln Sie die Namen und Typen der Argumente. Schauen Sie sich die Funktionsdefinition an:
directory
unddomainMask
sind die Namen, verwenden Sie die Typen, aber Sie sollten sie trotzdem für Funktionen weglassen. Sie werden hauptsächlich in Methoden verwendet.So bleibt uns mit (aktualisiert für Swift 2.0):
und für Swift 3:
quelle
NSString
eher zu als seinString
.String
funktioniert in Xcode 6.0 und 6.1. Im AllgemeinenString
undNSString
werden in Swift automatisch überbrückt. Vielleicht mussten SieNSString
aus einem anderen Grund besetzen.String
Spielplatz übertragen, jedoch nicht in einer App. Check out Frage ( stackoverflow.com/questions/26450003/… )/var/mobile/Containers/Data/Application/9E18A573-6429-434D-9B42-08642B643970/Documents
/var/mobile/Containers/Data/Application/77C8EA95-B77A-474D-8522-1F24F854A291/Documents
Swift 3.0 und 4.0
Das direkte Abrufen des ersten Elements aus einem Array führt möglicherweise zu einer Ausnahme, wenn der Pfad nicht gefunden wird. Anrufen
first
und dann auspacken ist also die bessere Lösungquelle
Die moderne Empfehlung lautet, NSURLs für Dateien und Verzeichnisse anstelle von NSString-basierten Pfaden zu verwenden:
So erhalten Sie das Dokumentverzeichnis für die App als NSURL:
Dies hat eine rudimentäre Fehlerbehandlung, da diese Art davon abhängt, was Ihre Anwendung in solchen Fällen tun wird. Dabei werden jedoch Datei-URLs und eine modernere API verwendet, um die Datenbank-URL zurückzugeben und die ursprüngliche Version aus dem Bundle zu kopieren, falls sie noch nicht vorhanden ist, oder im Fehlerfall eine Null.
quelle
Xcode 8.2.1 • Swift 3.0.2
Xcode 7.1.1 • Swift 2.1
quelle
Normalerweise bevorzuge ich die Verwendung dieser Erweiterung:
Swift 3.x und Swift 4.0 :
Swift 2.x :
quelle
let path = FileManager.documentsDir()+("/"+"\(fileName)")
, können Sie ihn ohne Unterschiede zwischen Thread (Haupt- oder Hintergrund) aufrufen.Für alle, die ein Beispiel suchen, das mit Swift 2.2 funktioniert, versuchen Abizern-Code mit modernem Fehler, den Fehler zu erfassen
Update Ich habe verpasst, dass das neue Swift 2.0 Guard hat (Ruby, sofern nicht analog), daher ist es mit Guard viel kürzer und besser lesbar
quelle
Bequemere Swift 3- Methode:
quelle
FileManager().urls(for: .documentDirectory, in: .userDomainMask).first!
Xcode 8b4 Swift 3.0
quelle
Normalerweise bevorzuge ich wie unten in Swift 3 , weil ich Dateinamen hinzufügen und eine Datei einfach erstellen kann
quelle
absoluteString
ist falsch. Um den Dateipfad für eine Datei-URL zu erhalten, müssen Sie deren.path
Eigenschaft