Estou tentando encontrar o caminho para a pasta Documentos com o código:
var documentsPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory:0,NSSearchPathDomainMask:0,true)
mas o Xcode dá erro: Cannot convert expression's type 'AnyObject[]!' to type 'NSSearchPathDirectory'
Estou tentando entender o que há de errado no código.
ios
swift
nsdocumentdirectory
Ivan R
fonte
fonte
Respostas:
Aparentemente, o compilador pensa que
NSSearchPathDirectory:0
é uma matriz e, é claro, espera o tipoNSSearchPathDirectory
. Certamente não é uma mensagem de erro útil.Mas quanto aos motivos:
Primeiro, você está confundindo os nomes e tipos de argumentos. Dê uma olhada na definição de função:
directory
edomainMask
são os nomes, você está usando os tipos, mas deve deixá-los de fora para as funções de qualquer maneira. Eles são usados principalmente em métodos.Isso nos deixa com (atualizado para o Swift 2.0):
e para Swift 3:
fonte
NSString
vez deString
.String
funciona no Xcode 6.0 e 6.1. Geralmente,String
eNSString
são ponte automaticamente no Swift. Talvez você tenha que escolherNSString
por outro motivo.String
em um playground, mas não em um aplicativo. Confira questão ( 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 e 4.0
Obter diretamente o primeiro elemento de uma matriz potencialmente causará exceção se o caminho não for encontrado. Então ligar
first
e desembrulhar é a melhor soluçãofonte
A recomendação moderna é usar NSURLs para arquivos e diretórios em vez de caminhos baseados em NSString:
Portanto, para obter o diretório de documentos do aplicativo como um NSURL:
Isso tem tratamento rudimentar de erros, pois esse tipo de depende do que seu aplicativo fará nesses casos. Mas isso usa URLs de arquivo e uma API mais moderna para retornar a URL do banco de dados, copiando a versão inicial do pacote se ele ainda não existir, ou nulo em caso de erro.
fonte
Xcode 8.2.1 • Swift 3.0.2
Xcode 7.1.1 • Swift 2.1
fonte
Normalmente eu prefiro usar esta extensão:
Swift 3.xe Swift 4.0 :
Swift 2.x :
fonte
let path = FileManager.documentsDir()+("/"+"\(fileName)")
você pode chamá-lo sem diferenças entre os threads (principal ou em segundo plano).Para quem olha o exemplo que trabalha com o Swift 2.2, o código Abizern com o moderno tenta pegar o erro
Atualização Perdi que o novo swift 2.0 tem proteção (Ruby, a menos que seja analógico), portanto, com a proteção, é muito mais curto e mais legível
fonte
Método Swift 3 mais conveniente :
fonte
FileManager().urls(for: .documentDirectory, in: .userDomainMask).first!
Xcode 8b4 Swift 3.0
fonte
Normalmente, prefiro o seguinte no swift 3 , porque posso adicionar um nome de arquivo e criar um arquivo facilmente
fonte
absoluteString
está errado. para obter o caminho do arquivo fro um fileURL você precisa para obter a sua.path
propriedade