J'essaie d'obtenir le chemin du dossier Documents avec le code:
var documentsPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory:0,NSSearchPathDomainMask:0,true)
mais Xcode donne une erreur: Cannot convert expression's type 'AnyObject[]!' to type 'NSSearchPathDirectory'
J'essaie de comprendre ce qui ne va pas dans le code.
ios
swift
nsdocumentdirectory
Ivan R
la source
la source
Réponses:
Apparemment, le compilateur pense
NSSearchPathDirectory:0
c'est un tableau, et bien sûr il attend le type à laNSSearchPathDirectory
place. Certainement pas un message d'erreur utile.Mais quant aux raisons:
Tout d'abord, vous confondez les noms et les types d'argument. Jetez un œil à la définition de la fonction:
directory
etdomainMask
sont les noms, vous utilisez les types, mais vous devriez quand même les laisser de côté pour les fonctions. Ils sont principalement utilisés dans les méthodes.Cela nous laisse donc (mis à jour pour Swift 2.0):
et pour Swift 3:
la source
NSString
plutôt queString
.String
fonctionne sous Xcode 6.0 et 6.1. Généralement,String
etNSString
sont pontés automatiquement dans Swift. Peut-être avez-vous dû vous lancerNSString
pour une autre raison.String
dans une aire de jeux, mais pas dans une application. Consultez la question ( stackoverflow.com/questions/26450003/… )/var/mobile/Containers/Data/Application/9E18A573-6429-434D-9B42-08642B643970/Documents
(2)/var/mobile/Containers/Data/Application/77C8EA95-B77A-474D-8522-1F24F854A291/Documents
Swift 3.0 et 4.0
Obtenir directement le premier élément d'un tableau entraînera potentiellement une exception si le chemin n'est pas trouvé. Donc, appeler
first
puis déballer est la meilleure solutionla source
La recommandation moderne est d'utiliser les NSURL pour les fichiers et les répertoires au lieu des chemins basés sur NSString:
Donc, pour obtenir le répertoire Document de l'application en tant que NSURL:
Cela a une gestion des erreurs rudimentaire, car cela dépend de ce que votre application fera dans de tels cas. Mais cela utilise des URL de fichiers et une API plus moderne pour renvoyer l'URL de la base de données, en copiant la version initiale hors du bundle si elle n'existe pas déjà, ou une valeur nulle en cas d'erreur.
la source
Xcode 8.2.1 • Swift 3.0.2
Xcode 7.1.1 • Swift 2.1
la source
Habituellement, je préfère utiliser cette extension:
Swift 3.x et Swift 4.0 :
Swift 2.x :
la source
let path = FileManager.documentsDir()+("/"+"\(fileName)")
vous pouvez l'appeler sans différences entre les threads (principal ou arrière-plan).Pour tous ceux qui recherchent un exemple qui fonctionne avec Swift 2.2, le code Abizern avec moderne essaie de saisir la poignée d'erreur
Mise à jour J'ai manqué que le nouveau swift 2.0 a une garde (Ruby sauf analogique), donc avec la garde, elle est beaucoup plus courte et plus lisible
la source
Méthode Swift 3 plus pratique :
la source
FileManager().urls(for: .documentDirectory, in: .userDomainMask).first!
Xcode 8b4 Swift 3.0
la source
Habituellement, je préfère comme ci-dessous dans swift 3 , car je peux ajouter un nom de fichier et créer un fichier facilement
la source
absoluteString
est faux. pour obtenir le chemin du fichier d'une fileURL, vous devez obtenir sa.path
propriété