Por que Swift não é só sobre UI, mas também sobre arquivos
\n\nQuando desenvolvedores começam a estudar Swift, na maioria das vezes escrevem aplicativos com interfaces, animações e requisições de rede. Mas, mais cedo ou mais tarde, surge a tarefa: salvar dados no dispositivo, ler um config, parsear um arquivo JSON ou simplesmente copiar um documento. E muitos se perdem aqui. Mas não deveriam — trabalhar com arquivos em Swift é tão elegante e bem pensado que depois disso não se quer voltar para outras linguagens.
\n\nNeste artigo, vamos abordar a interação com o sistema de arquivos em Swift do simples ao complexo. Você aprenderá como criar, ler, escrever e excluir arquivos, trabalhar com diretórios, tratar erros e até criptografar dados. Vamos lá!
\n\nFundamentos: FileManager e FileHandle
\n\nO coração do sistema de arquivos em Swift é a classe FileManager. É um "gerenciador" que sabe tudo sobre pastas e arquivos no dispositivo. Ele permite verificar existência, mover, copiar e excluir objetos. Para trabalhar com o conteúdo dos arquivos (leitura e escrita), usa-se FileHandle ou métodos de nível mais alto como Data, String e Codable.
Onde armazenar arquivos? Caminhos e diretórios
\n\nAntes de escrever código, é preciso entender onde temos permissão para salvar dados. No iOS e macOS, existem regras rigorosas: o aplicativo só pode escrever em sua própria sandbox (sandbox). Os diretórios mais populares são:
\n\n- \n
- Documents — para dados do usuário que devem ser preservados em backups. \n
- Library/Caches — para arquivos temporários que o sistema pode excluir. \n
- tmp — para arquivos descartáveis, excluídos na reinicialização. \n
Obter o caminho para a pasta desejada é muito simples:
\n\nimport Foundation\n\nlet fileManager = FileManager.default\nlet documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first!\nprint("Documents: \\(documentsURL.path)")\n\nlet cachesURL = fileManager.urls(for: .cachesDirectory, in: .userDomainMask).first!\nprint("Caches: \\(cachesURL.path)")\n\nCriação e exclusão de arquivos em Swift
\n\nVamos começar com o mais básico — criar um arquivo vazio no diretório Documents:
\n\nlet fileURL = documentsURL.appendingPathComponent("myFile.txt")\n\n// Cria o arquivo, se não existir\nif !fileManager.fileExists(atPath: fileURL.path) {\n fileManager.createFile(atPath: fileURL.path, contents: nil, attributes: nil)\n print("Arquivo criado!")\n}\n\nObserve: createFile(atPath:contents:attributes:) retorna um Bool que informa se o arquivo foi criado com sucesso. Sempre verifique o resultado — isso evitará erros inesperados.
A exclusão de um arquivo é feita com uma linha:
\n\ndo {\n try fileManager.removeItem(at: fileURL)\n print("Arquivo excluído")\n} catch {\n print("Erro ao excluir: \\(error.localizedDescription)")\n}\n\nAqui usamos try e o bloco do-catch — abordagem padrão para tratamento de erros em Swift. Nunca chame removeItem sem verificação, caso contrário o aplicativo irá travar.
Leitura e escrita de arquivos de texto
\n\nO cenário mais comum é trabalhar com dados de texto. Swift oferece métodos convenientes para leitura de arquivo Swift e escrita através de strings:
\n\n// Escrita de texto\nlet text = "Olá, mundo! Hello, Swift!"\ndo {\n try text.write(to: fileURL, atomically: true, encoding: .utf8)\n print("Texto escrito")\n} catch {\n print("Erro ao escrever: \\(error)")\n}\n\n// Leitura de texto\ndo {\n let savedText = try String(contentsOf: fileURL, encoding: .utf8)\n print("Lido: \\(savedText)")\n} catch {\n print("Erro ao ler: \\(error)")\n}\n\nA flag atomically: true garante que a escrita seja atômica — primeiro os dados são escri