Tutorial 37:
Handling File Storage with FileManager in iOS

(Or How to Save a Bunch of Silly Memes Like a Pro)
⸻
Introduction
Ever wanted to save a secret stash of memes or maybe a collection of ancient pizza receipts
inside your app?
Today, we’re diving into FileManager — your friendly neighborhood hero that lets you create, read, update, and delete files and folders on an iOS device!
We’ll build a Meme Vault app — a silly (but powerful!) little app that lets users:
• Save memes (images) to the app’s storage
• List saved memes
• Delete memes
• Feel like a hacker of hilariousness
Ready? Let’s meme-ify your coding skills! 
⸻
What You’ll Learn
• Basics of FileManager
• How to save files locally
• How to list files in a directory
• How to delete files
• Common pitfalls (and how to avoid looking like a noob )
⸻
Project Setup: Meme Vault
- Open Xcode.
- Create a new SwiftUI App.
- Name it MemeVault.
- Choose Swift and SwiftUI as usual.
Tip: You can also follow along in a Playground if you just wanna vibe and test.
⸻
Setting up FileManager Helper
Let’s create a neat little class called FileManagerService that will handle all the messy file stuff for us.
import Foundation
import SwiftUI
class FileManagerService {
static let shared = FileManagerService()
private init() {}
let folderName = "SavedMemes"
private var folderURL: URL? {
do {
let documentsURL = try FileManager.default.url(
for: .documentDirectory,
in: .userDomainMask,
appropriateFor: nil,
create: false
)
return documentsURL.appendingPathComponent(folderName)
} catch {
print("
Error getting documents directory: \(error)")
return nil
}
}
func createFolderIfNeeded() {
guard let url = folderURL else { return }
if !FileManager.default.fileExists(atPath: url.path) {
do {
try FileManager.default.createDirectory(at: url, withIntermediateDirectories: true)
print("
Folder created!")
} catch {
print("
Error creating folder: \(error)")
}
}
}
func saveImage(image: UIImage, name: String) {
createFolderIfNeeded()
guard let url = folderURL?.appendingPathComponent(name),
let data = image.jpegData(compressionQuality: 1.0) else { return }
do {
try data.write(to: url)
print("
Meme saved!")
} catch {
print("
Error saving meme: \(error)")
}
}
func getImages() -> [UIImage] {
var images: [UIImage] = []
guard let url = folderURL else { return [] }
do {
let fileURLs = try FileManager.default.contentsOfDirectory(at: url, includingPropertiesForKeys: nil)
for fileURL in fileURLs {
if let data = try? Data(contentsOf: fileURL),
let image = UIImage(data: data) {
images.append(image)
}
}
} catch {
print("
Error listing memes: \(error)")
}
return images
}
func deleteImage(name: String) {
guard let url = folderURL?.appendingPathComponent(name) else { return }
do {
try FileManager.default.removeItem(at: url)
print("
Meme deleted!")
} catch {
print("
Error deleting meme: \(error)")
}
}
}
⸻
MemeVaultView: Upload, List, and Delete
Let’s hook up a simple SwiftUI view:
import SwiftUI
struct MemeVaultView: View {
@State private var memes: [UIImage] = []
@State private var selectedImage: UIImage?
@State private var showImagePicker = false
var body: some View {
NavigationView {
VStack {
if memes.isEmpty {
Text("No memes yet. Add one!
")
.padding()
} else {
ScrollView {
ForEach(memes.indices, id: \.self) { index in
Image(uiImage: memes[index])
.resizable()
.scaledToFit()
.frame(height: 200)
.padding()
.onLongPressGesture {
deleteMeme(at: index)
}
}
}
}
Button(action: { showImagePicker = true }) {
Text("Add Meme
")
.padding()
.background(Color.blue)
.foregroundColor(.white)
.cornerRadius(8)
}
.padding()
}
.navigationTitle("Meme Vault
")
.onAppear(perform: loadMemes)
.sheet(isPresented: $showImagePicker, content: {
ImagePicker(selectedImage: $selectedImage, didFinishPicking: saveMeme)
})
}
}
private func loadMemes() {
memes = FileManagerService.shared.getImages()
}
private func saveMeme() {
guard let selected = selectedImage else { return }
let fileName = "meme_\(UUID().uuidString.prefix(6)).jpg"
FileManagerService.shared.saveImage(image: selected, name: fileName)
loadMemes()
}
private func deleteMeme(at index: Int) {
let fileName = "meme_\(index).jpg"
FileManagerService.shared.deleteImage(name: fileName)
loadMemes()
}
}
struct MemeVaultView_Previews: PreviewProvider {
static var previews: some View {
MemeVaultView()
}
}
⸻
Quick ImagePicker Setup
You’ll need a simple ImagePicker. Here’s a quick one:
import SwiftUI
import UIKit
struct ImagePicker: UIViewControllerRepresentable {
@Binding var selectedImage: UIImage?
var didFinishPicking: () -> Void
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
class Coordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
let parent: ImagePicker
init(_ parent: ImagePicker) {
self.parent = parent
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let image = info[.originalImage] as? UIImage {
parent.selectedImage = image
parent.didFinishPicking()
}
picker.dismiss(animated: true)
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
picker.dismiss(animated: true)
}
}
func makeUIViewController(context: Context) -> UIImagePickerController {
let picker = UIImagePickerController()
picker.delegate = context.coordinator
return picker
}
func updateUIViewController(_ uiViewController: UIImagePickerController, context: Context) {}
}
⸻
Common Mistakes to Avoid
Mistake Solution
Saving files outside the Documents directory Always use .documentDirectory
Forgetting to create folders before writing Always check and create!
Using weird file formats Stick to .jpg, .png, .txt, etc.
Not handling errors At least print them out!
⸻
Final Words
Congrats! You now know how to store, read, and delete files in iOS like a true meme lord .
You could totally adapt this knowledge to:
• Save app settings
• Store offline data
• Build a personal diary app
• Hide secret pizza recipes
The filesystem is your oyster .
Next challenge: Add folders by categories like “Dank Memes”, “Wholesome”, “Dark Humor”, etc.!
⸻
Code On and Meme Away!
⸻
Would you like me to also create a bonus challenge section where users can extend the app (like adding folders for categories)?
It would make it even more fun if you want to turn it into a full beginner project!